零基础开始学C语言,这是我在看谭浩强的《C语言程序设计》第四版时,一些易混易忘的知识:
1.①优先级关系:!(非) > 算数运算符 > 关系运算符 > &&和|| > 赋值运算符
②条件运算符的优先级别比关系运算符 和 算数运算符 都低,例:
max = (a > b) ? a : b
括号可以不要,可写成
max = a > b ? a : b
如果有
a > b ? a : b + 1
相当于a > b ? a : (b + 1),而不相当于(a > b ? a : b) + 1。
2.C系统在用字符数组存储字符串常量是会自动加一个'\0'作为结束符。例如:
char c[ ] = "I am happy";
请注意,此时数组长度不是10 ,而是11。
3.① strcat 函数---字符串连接函数
一般形式为
strcat( 字符数组1 , 字符数组2 )
② strcpy 和 strncpy 函数---字符串赋值函数
一般形式为
strcpy ( 字符数组1 , 字符数组2 )
③ strcmp 函数---字符串比较函数
一般形式为
strcmp(字符数组1,字符数组2 )
④ srrlen 函数---测试字符串长度的函数
一般形式为
strlen(字符数组)
注意:函数的长度为字符串中的实际长度(不包括'\0'在内)。例如:
char str[10] = "China";
printf("%d",strlen(str));
输出结果是不是10,也不是 6,而是 5。
4.用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,且两个数组共占同一段内存单元。 当形参数组中各元素的值发生变化会使实参数组元素的值同时发生变化。
5.外部变量与局部变量同名,分析结果。例:
#include
int a = 3,b = 5;
int main()
{ int max(int a,int b);
int a = 8; // a是局部变量,作用于第5,6和7行,,,此范围内全局变量a 被局部变量a屏蔽,而全局变量b有效,所以最后结果是8
printf("max = %d\n",max(a,b));
return 0;
}
int max(int a,int b)
{ int c;
c = a > b ? a : b;
return(c);
}
运行结果: max = 8
6.①在定义变量时可以对它初始化,如:
int *p = &a[0];
它等效于下面两行:
int *p;
p = &a[0]; //不能写成*p = &a[0];
也可以写成
int *p = a ;
②用指针引用数组元素时,
a是数组名,p是指向该数组元素的指针变量,其初值 p = a 。*(p+i)与*(a+i)等价
③ 以变量名和数组名作为函数参数的比较:
实参类型 变量名 数组名
要求的形参类型 变量名 数组名或指针变量
传递的信息 变量的值 实参数组首元素的地址
通过函数调用能否改变实参的值 不能改变 能改变
④ *p++;
由于 ++ 和 * 同优先级,结合方向自右向左,因此它等价于*(p++)。先引用 p 的值,实现 *p 的运算,然后再使p自增 1 。
++(*p);
表示 p 指向的的元素的值加 1 的值。
*(++p);
若 p 初值为 a (即 &a[0]),若输出 *(p++) ,得到 a[0] 的值,而输出 *(++p) 得到 a[1] 的值。
⑤ int (*p)[4];
表示定义 p 为一个指针变量,它指向包含 4 个整形元素的一位数组。注意 *p 两侧的括号不能缺少。因为 [ ] 运算级别高。
7. malloc 函数,calloc 函数,free 函数,relloc 函数,,,这4个函数的声明在 stdlib.h 头文件中。
8.以下是程序中的一部分:
srruct Student
{ int num;
char name[20];
float score;
}student1;
scanf("%d%s%f",&student1.num,student1.name,&student1.score);
注意在 scanf 函数中在成员 student1.num 和 student1.score 的前面都有地址符 & ,而在 student1.name 前面没有 & ,这是因为 name 是数组名,本身就代表地址,故不能画蛇添足地再加一个 & 。
9.结构体变量所占内存长度是个成员所占的内存长度之和;而共用体变量所占的内存长度等于最长的成员长度。
10.共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。