C语言常见陷阱总结

1.  1 char array1[100]; 2 char* array2; 二者都可以当指针用,使用时有何区别?

  1中字符数组,存储于栈区,sizeof(array1)为100,aray1代表首元素首地址,不可以被赋值,array1[0]这样可以被赋值,数组大小确定,难以扩容

  2中存储于字符常量区,sizeof(array2)为4,array2可以被赋值,array2[0]不可以被赋值,空间大小可变

2. 32位中,long型和指针占4个字节,64位中占8个字节

3. strcat连续拼接字符串时,每次都要找到结尾,解决方案时给结尾做标记

4. const在C语言中为只读变量,C++中为常量

5. 一般机器默认小端存储,苹果机器为大端存储

6. char a[] = "Hello world"; 

 sizeof(a) = 12    注:sizeof时算 \0 ,strlen时不算 \0 

 sizeof(*a) = 1      sizeof(&a) = 4

 当字符数组以函数参数形式存在时,sizeof为4

7. printf函数执行时,计算顺序是从后向前,输出顺序是从前向后,可以将printf函数中想成传入的参数,存储于栈区

8. 

int a[] ={2,8,16,24};
char* p1 = a;
char* p2 = &a[3];
p2-p1 = ?

本题中,两个地址相减,求的是指针的偏移量,p1指向的内容是2,p2指向的内容是24,p2-p1为3个4字节大小,为12,又因为p1和p2的基本类型为1个字节,所以(3*4)/1=12

9. 括号表示表达式,表达式要变成int类型计算;有符号要向无符号类型转换;小类型要向大类型转换

10.

(a=1)?2:3

a=1,表示整个表达式的值为1,所以输出为2

11.switch case语句中,每个case过后如若没有遇到break,则顺次向下执行

12.char a[100] = {'a','b','c','\0','1','2'};  遇到  '\0'  字符串结束

   char a[100] = {'a','b','c','0','1','2'};   '0' 代表字符不是'\0'

     char a[100] = {'a','b','c',0,'1','2'};     '\0'就是0,字符串结束

13.阿克曼函数  ack(1,k) = 2+x;   ack(2,x) = 3+2*x;   ack(3,x) = 2^(x+3)-3;

14.在移位运算时,数据需要补位时,符号位是什么就补什么

     如

int i = 0xf0000000;i >>=1; i=0xf8000000

15.常量数值不能进行自加自减运算

16.注意与或运算,与运算时,前面表达式为假时,与运算符后面的表达式不参与运算,输出为假,若为真,则再计算与运算符后面的表达式

     或运算时,或运算符前面的表达式为真时,不计算或运算符后面的表达式,直接输出为1,若为假,则在计算或运算符后面的表达式

17.sizeof返回值为unsigned int,当int遇到了unsigned int 时,转换为unsigned int进行计算

18.栈区空间的生命周期在遇到}时截止,在}之前返回栈区申请的空间不存在,因为被回收了,字符常量区的内容只能读不能向里面写

 

posted @ 2016-07-14 10:45  zs0909zs  阅读(2180)  评论(2编辑  收藏  举报