因为本身就是自己自学时零碎记录的觉得自己容易遗忘的部分,所以可能显得有些杂乱,发出来和大家一起分享,也记录一下自己自学路的开端。
第二章:
1.当赋值发生在变量定义的时候称为初始化。
2.有运算符的式子叫做表达式。
3.会变的是变量,不会变的是常量。
4.const int change=100 ,int前加const,表示这个变量不能被修改。
5.两个整数的运算结果只能是整数,要用浮点数(10.0)。
6.double(双精度浮点数),float(单精度浮点数),表示浮点数。输入时scanf里是%lf,输出时%f。
7.表达式里有算子和运算符。
8.赋值运算自右向左结合。(a=b=6)。
9.“++“,“--”,运算符效果是使变量的值+1或-1,但a++的值是a+1以前的值,++a的值是a+1以后的值,效果都是让a+1.
10.当两个值的关系符合关系运算符的预期时,结果为1,不符合结果为0。
11. 1)算数运算>关系运算>条件运算>赋值运算(条件运算符:表达式1?表达式2:表达式3,如果1为真,表达式2的值为整个条件表达式的值,否则表达式3是表达式的值。)
2)单目运算符优先级高于双目运算符 。
3)!>&&>||。
13.
14.
15.bool类型输出只能显示为1,0,没法输出true,false。
16.
17.a=3+4,5+6 ,a的值为前面那个,因为逗号预算符优先级最低,前面的值算出来优先赋值给a。a=(3+4,5+6),值为后面那个,因为逗号组合关系为自左向右,而括号把逗号运算符的优先级提到最高。。
18.
条件运算符优先级高于赋值运算符但是低于其他运算符。
19.如果没有大括号else自动匹配最近的那个if,缩进格式不能暗示else的匹配。
20.
- case后的值只能是整数常量。
- case会跳转到type那个值的位置开始执行程序,直到遇到break
- default部分除非遇到break,不然都会执行。
21. #include<stdlib.h>( rand() ) #include<time.h>( time(0) ).
Srand((unsigned)time(null))通过时间来生成不同的随机数种子,以达到生成随机数的目的,同样的随机数种子会生成同样的随机数。
22.break,continue
23.goto out; (用于多重循环中直接跳出循环,会跳到goto后面那个值处。)
Out:
24. 1)定义数组时数组类型实际为数组中元素的类型。
2)C99之前数组的大小(元素的数量)只能是常数,之后可以用变量来定义数组的大小。(不建议用变量定义。)
3)一旦创建,数组大小不可以改变。
4)最大的下标为数组个数减1。
25.return会停止函数的运行并返回一个值或不返回。
26.函数声明的参数名称可以不写,但通常都会和函数定义中的一样。
27.c语言在调用参数时永远只能传值给函数。
28.变量生存期:参变量出现到消亡的时间 作用域:可以访问到变量的范围(变量起作用的范围)。 变量的生存期和作用域就是在函数大括号内部。
29.本地变量定义在块中(大括号里),离开块,变量就消失了。块外面定义的变量块里面仍然有效,块里面定义了和外面同名的变量则掩盖了外面的,不能在一个块内定义同名的变量,本地变量不会被默认初始化。
30.sizeof()给出某个类型或变量占据的字节数。常用法:用于计算数组的大小sizeof(a[n])/sizeof(a[0]).
31&可以得到变量的地址,地址的大小是否与int类型相等取决于编译器(32位还是64位),想要输出地址要用%p。
32.数组的地址&a=a=a[0],a[1]比a[0]大4,相邻的数组之间都差4.
33. 1)指针变量的值是别的变量的地址。
2)int*p,q, 此时p是指针变量,q只是int类型的变量。 int*p=&i。
3)作为参数时 例:void f(int*p) f(&i)
4)*p作为一个整数,p是值的地址,改变*p的值,会改掉地址p所指向的变量的值。
34.数组作为函数参数时:
1)在函数定义中数组为a[],中间为空
2)此时函数中数组实际上是指针(数组的地址),因此在函数中不能通过sizeof()的方式得到函数的大小。
3)int sum(int*ar, int n)=int sum(int ar[],int)作为函数参数时是等价的。
3)int a[10]; int*p=a 对于数组取地址,不需要&
4)但是数组的单元(每个元素)表达的是变量,在取地址时仍需&。
5)&a==a==&a[0],数组a的地址等于a[0]的地址
6)[ ]运算符可以对数组做,也可以对指针做
int *p=&min; //min 是普通变量
*p=min; p[0]=min; //将变量当作数组取出该地址上的第一个值
7)*运算符可以对指针做,也可以对数组做。
int a[10];
*a=a[0];
8)数组变量是const的指针所以不能直接被赋值
int a[] = int * const a;
35.字符类型
1)输入char c;
scanf(“%c”,&c);(输入1)
Scanf(“%d”,&c);(输入49) 两种情况相等,因为1的ascll码等于49
2)49==‘1’
3)scanf(“%d %c”,&a,&c), 当同时输入整数类型和字符时,最好加空格,因为整数类型会一直读到不是整数类型为止。
36.逃逸字符
37.字符数组,字符串 (结尾有一个0或“/0”,因此字符串占据空间的大小比它的字面量大1,但是字符串的大小是不包括那个0的。)
1)c语言的字符串是以字符数组的形态存在的
2)不能用运算符对字符串做运算
3)通过数组的方式可以遍历字符串
4)两个相邻的字符串常量会被自动连接起来
5)字符串字面量可以用来初始化字符数组
38.字符串输入输出
1)%s,输入时读到空格、tab或回车为止,不安全,超出界限会崩溃
2)%7s,中间加入数字,数字大小为字符串可读的最大长度,安全
39.char*string
Scanf(“%s”,string),错误的,指针变量并没有指向一个实际地址,不能当作字符串来看
40. char string[]=””,字符串长度为1. Char string[100]=””,char[0]的值为“/0”
41.字符串数组 #include<string.h>
1)strlen() 返回字符串长度,不包括0
2)strcmp(s1,s2),比较函数大小,相等返回0,否则返回它们不相等的字符,前面减后面的大小。 Strncmp()只比较前n个长度
3)strcpy(s1,s2),把s2表示的字符串,拷贝到s1所指向的空间(地址),需要足够的空间 安全版本:strncpy() ,n表示最长能够拷贝的长度
4)srcat(s1,s2),把s2表示的字符串拷贝到s1后面连接成一个字符串,需要s1有足够的空间 安全版本:strncat(),n表示最长能够拷贝的长度
5)strchr(s1,c)从左边开始寻找c在s1中第一次出现的位置
Strrchr(),从右边开始找 没找到返回null,找到了返回字符c的地址
更多推荐
翁恺老师c语言课程笔记
发布评论