关于初识C语言的知识和思考笔记

关于初识C语言的知识和思考笔记,第1张

一.第一个代码

1.创建一个项目:新建空项目。如果没了,可以视图——解决方案管理器

2.创建一个源文件:.c文件就是源文件,.h是头文件。右击添加——新建项——C++文件

3.写代码 4.编译运行 快捷键control+F5

1.主函数:

main函数是C语言的入口,main是函数名,大括号是函数体,int是函数返回类型,int是整型。

printf:打印函数,是库函数,使用时需要引用头文件#include

打印整数:printf(“%d\n”,100) 100按照%d整型的格式打印。

二.数据类型

float浮点数:小数

double双精度浮点型:0.00

int整型:整数

char字符类型:字母

问1:计算一下这些类型的数据所占大小:size of (谁的大小)

printf(“%d\n”,size of (char)) ;//char的大小:1Byte(字节)

问2:计算机中的单位:

bit 比特位 :可以存一个二进制位。最小单位。

byte:字节:=8bit

kb=1024byte

mb,gb

问3:为什么这么多类型?

空间利用率。

三.常量变量

int age = 20

局部变量:大括号内

全局变量:主函数外

问1:写一个代码求两个整数的和

scanf函数是输入函数

但是编译器报错,解决方法源文件加上

附1:scanf函数:通过键盘输入,给变量赋值

具体:把键盘输入的字符1,2,3,转换为输入控制符所规定格式的数据,然后存入以输入参数的地址为地址的变量中。

如果直接令i = 10,则这个i永远等于10,我们希望i的值可以由用户的键盘输入。

所以int i;

scanf("%d,&i");放进以变量i的地址为地址的变量i中。

再通过printf函数打印:

printf("i=%d\n",i);

综上:键盘上输入字符1,2,3,然后%d将这三个字符转化为十进制的数字123,放在变量i中。

四.变量的作用域和声明域

作用域:这个变量在哪里可以使用,哪里就是他的作用域。

局部变量的作用域就是其所在的范围。

如果要在不同文件中使用变量,那么应该在顶部声明这个变量

比如Test1中有int g_val,那么我要在Test2中使用的话,在Test2的顶部写extern int g_val即可使用。

生命周期:变量的创建至销毁

五.常量

1.分类:

1.字面常量:314;10;"a" 没什么意义,但存在

2.const修饰的常变量:

1)int num =10 ;num=20;打印出来是20,但是如果加上const int num =10,这个num永远是10不能被修改。

2)当int n =10 defin; int arr2[n] = {0};这样是不行的因为n是变量。但是const int n =10,这样就可以了。

3.#define定义的标识符常量。

#define Max = 10000

4.枚举常量:可以一一列举的常量(性别,星期)

enum Sex

{

MALE;

FEMALE;

SECRET;

}

枚举类型变量的未来取值(只能是这三种)

 

六.字符串

问1:就是一串字符,如何描述?

用双引号括起来的一串字符:“Hello”

问2:字符数组?

一组相同类型的元素:char arr[ ] = "Hello"

此时此刻在:测试——窗口——监视中:

有六个元素:最后一个 \0 是隐藏起来的。

证明:字符串在结尾的位置隐藏了一个\0的字符,这是字符串的结束标志。

问:结果是否一样?

arr1是字符串,会多一个\0。

arr2后面没有\0,所以字符串没有停止,打印出来后面的结果是未知的。所以乱码。

如果在arr2后加一个\0

打印结果为abc。

并且在计算字符串长度的时候,结束位\0不算作字符串内容。

七.转义字符

假设:在屏幕上打印:c:\code\test.c

什么原因:

转义字符转变了这个字符原有的意思

当打印 (are you ok??)的时候??)这三个字符打不出来,需要在前面加\变为\?\?)

如果想输出一个单引号,就会变成这样 ''' 是打不出来的,要转变成 ' '\ '

\ddd :printf("%c\n,'\130') 8进制的130的十进制是多少? 是88。X的ASCII码是88。打印结果是X

关于ASCII码:A:65 a:97

\xdd :printf("%c\n,'\x30') 十六进制的30的十进制是多少?是48。0对应ASCII码是48。打印结果是0。

题1:printf("%d\n,strlen("c:\test\328\test.c"));结果是多少?

\32 算一个,8算一个,因为八进制中没有8

八选择语句

if(a == 1)

printf("好好好\n");

else

printf("哈哈哈\n");

九.循环语句

显示行号:printf("写代码:%d\n”,line) ;

十.函数和数组

正常的两个数相加:

int main()

{

int num1=0;

int num2=0;

scanf("%d%d",&num1,&num2);

sum=num1+num2;

printf("d\n",sum);

return 0

}

用函数的方式解决:让Add(num1,num2)函数帮我完成这件事情:

Add (int x,int y)

{

int z =0;

z =x+y;

return z;

}

int main()

{

int num1=0;

int num2=0;

scanf("%d%d",&num1,&num2);

int sum =Add(num1,num2);

printf("d\n",sum);

return 0

}

如果变量太多:运用数组:一组相同类型元素的集合

int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //十个整型数据

char ch[5] = {'a','b','c'}; //5个字符型数据,剩余的默认为0

问1:数组如何访问?

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

可以用下标访问:arr[1]就是1

问2:把数组内容全部打印出来

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

int i = 0;

while (i

{

printf("%d",arr[i]);

i++

}

return 0;

十一. *** 作符

1.算数 *** 作符 + - * / %(取余数)

2.移位 *** 作符>>

打印%f后,第一行是4,第二行是4.5,必须要有一个是小数形式。

9余2是1。

问1:

int a =2;

int b =a //向左移动一位

printf("%d\n",b);

结果为多少?

向左移动一位,移动的是二进制位。

a是2,二进制序列是0000000 0000000 0000000 0000010 ,向左移动一位:0000000 0000000 0000000 0000100,就变成了4。

3.位 *** 作符

&与 |或 '非

4.单目 *** 作符:只有一个 *** 作数(像a+b就是双位 *** 作符)

如:!逻辑取反(12345为真,0为假)

如:& 取地址

如:sizeof。

sizeof(int);计算类型或者变量大小的。

问2:结果是多少?

是 -1。位,是二进制位,~按位取反就是把原来所有的1变成0,0变成1。(除了符号位)

0的二进制怎么表示?32个0,因为0是整型,整型是四个字节,一个字节是8个比特位。

所以00000000 00000000 00000000 00000000取反

变成了11111111 11111111 11111111 11111111

整数在内存中存储的是补码,一个整数的二进制表示有三种:1.原码2.反码3.补码

比如:-1的二进制序列:最高位写1表示是负数。(针对负数)

原码:10000000 00000000 00000000 00000001

最高位不变,其他位取反加一得补码:11111111 11111111 11111111 11111111(二进制序列中存的是补码)

如果是正数,三个码都相同。

原码变补码:最高位不变,其他位取反加一

补码变原码:减一取反

问3:a=10,b=++a的结果是什么?

b=11,a=11先++,后使用:a原来是10,++后是11,赋给b为11,此时a也是11。

问4:a=10,b=a++的结果是什么?

b=10,a=11先使用,后++

(类型)是强制类型转换

假如:int a = 3.14;

类型数据不对,这样会丢失精度。

想避免警告出现:int a = (int)3.14;// 浮点型强制转换为整型

5.逻辑 *** 作符

并且&&

或者||

6.条件 *** 作符

用条件 *** 作符表示就是:max = a>b ? a : b ;首先如果a>b,a赋值给max,否则b赋值给max

7.逗号表达式

十二.常见关键字

register 寄存器关键字

问1:计算机的数据可以存储到哪里?

内存,硬盘,网盘,高速缓存,寄存器

return 返回

signed有符号的,正负的

unsigned无符号的

static静态的

union联合体

void 空

define和include是不是?不是,他们是预处理指令。

typedef类型重定义:

typedef unsigned int uint8_t;把unsigned int 换个名字叫uint8_t

uint8_t num;他就是unsigned int num。

static

问2:结果?

十个2。正确√

如果前面加了static

结果为234567891011

static改变了a的生命周期,本质上是改变了存储类型,使其从局部变量变成了全局变量

static修饰全局变量的结果:会使这个变量只能在自己的源文件内部使用,其他.c文件不能使用 。

问3:可以用吗?

可以,要声明函数Add

如果前面加上static,那么这个函数只可以在所在文件使用了。

十三.#define定义常量和宏

define 是一个预处理指令

定义常量 #define MAX 1000;

定义宏

想要一个X+Y的加函数

#define ADD(X,Y) ((X)+(Y) ) //要这么写 ,宏是有参数的

十四.指针

内存:是电脑上的存储器,类似现实中空间的使用。现实中找到一个房间,有房门号。内存被划分成一个个有效的空间。

问1:内存如何编号?

32位系统就是32位地址线,通电,电信号转化成数字信号:1和0组成的二进制序列一共32位。一共有2的32次方个编号。这个编号就是内存的地址。

问2一.个内存是多大空间?

一个字节Byte=8bit

int a = 10; a在内存中需要分配四个字节。

此时&a,取地址a,对应四个字节,拿出第一个字节的地址。

打印地址:

对应:0055FC2C

想把取的地址存起来:用pa(指针变量)

pa = &a

问:pa的类型是什么?

int *pa // pa就是指针变量,就是用来存放地址的。

例:char ch = 'w';//字符类型的变量ch中存放的数是w。

现在要取ch的地址,然后放在pc中:

char * pc = &ch; //pc的变量类型是char,*是取ch的地址。

int a =10;

int* pa = &a; // pa中存放了a的地址

//目的是什么?是为了通过a的地址,找到a。

* pa = 20 // *pa是通过pa的地址找到a,并且赋a的值为20。*是解引用 *** 作符。

*p找到的就是num,*p就是指针变量。

总结:

指针变量的用途:(他就是一个地址,使用指针的时候就是在使用其对应的地址)

1.存地址,地址对应一个变量。

2.有朝一日通过* *** 作符找到其对应的变量。

十五.结构体

描述复杂对象:例如描述学生就是由姓名,学号,身高,体重...

struct Stu

{

char name [20];

int age;

double score;

}

然后在主函数中:

int main ()

{

struct Stu s = {"张三" , 20 , 86.3};

printf("%s%d%lf \n",s.name ,s.name,s.score); //点 *** 作符:引出结构体的成员的变量

return 0

}

还有两种打印方法:

1.如果知道的是结构体指针(s的地址):

如果把s的地址放在指针变量ps中:

struct Stu*ps=&s // ps指向s,s的类型是struct Stu

printf("%s%d%lf \n",(*ps).name ,(*ps).name,(*ps).score); //也能打印出相同的内容

2.printf("%s%d%lf \n",ps ->name ,ps ->name,ps ->score); //也能打印出相同的内容

注:->用法

结构体指针->成员变量名

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存