zoukankan      html  css  js  c++  java
  • 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时算 ,strlen时不算  

     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','','1','2'};  遇到  ''  字符串结束

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

         char a[100] = {'a','b','c',0,'1','2'};     ''就是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.栈区空间的生命周期在遇到}时截止,在}之前返回栈区申请的空间不存在,因为被回收了,字符常量区的内容只能读不能向里面写

  • 相关阅读:
    事件记录
    C++和extern C
    中断控制器
    NAND FLASH控制器
    MMU实验
    存储管理器实验
    GPIO实验
    linux与Windows使用编译区别及makefile文件编写
    ubuntu如何为获得root权限
    VI常用命令及linux下软件
  • 原文地址:https://www.cnblogs.com/zhangshuang0909/p/5669569.html
Copyright © 2011-2022 走看看