c 中容易出错的 细节

一般出考点的地方就在宏定义上,例如
#define a 7 + 3

    #define b (2 + 1)

    #define dvx(x, y)  (x * y)

试写出以下宏dvx(a,b)的结果?

正确的结果应该是 :7 + 3 * ( 2+1 ) = 16

很多人都会得出 30 的结果,原因就是不了解宏只是简单的替换,不会做什么运算。


二、strlen() 与 sizeof()

   两者要诉述原理估计要长篇大论了,其实我们只要记住一下几个例子就能从中了解他们的原理了:

   char str[100] = "zhanglei";

   char *p = str;

   int n = 100;

sizeof(str) = 100; sizeof(p) = 4; sizeof(n) = 4

   strlen(str) = 8;

sizeof() 是计算数组的空间大小,strlen是计算数组中元素的个数,且遇到'/0'结束;对于指针,指向的是内存的地址,自身只占据指针类型占据的空间大小,因 其是动态存储,分布在堆栈区,在32位机上,和整形大小是一样的,都是4;一下这个函数参数与指针等价:

 void function(char str[])

{....}

  sizeof(str) = 4;

还有一种更加迷惑的形式:void *p = malloc(100);

看似好像申请了100个空间,但是sizeof(p) = 4;p 指定的还是地址。


三、变量

  在内存中系统提供有三种存储空间:

1、静态存储区

2、动态存储区

3、程序区

其 中静态存储区主要存储全局变量,在整个程序运行期间都会存在,动态存储区主要放置一些局部变量,在内存中分布在堆栈区,当函数结束的时候会自动释放,其中 有一个关键的词:static,当全局变量定义为static类型后,extern就不能在调用它 ;局部变量被定义成static后,变量值在整个函数运 行期间只被初始化赋值一次,且被static修饰的变量和函数只能作用与此函数或此文件中;


字符串数组与字符串指针
   字符串数组是在栈中或静态数据存储区中分配存储单元,把整个字符串都放进去,可以任意读写

  字符串指针,字符串存放在文字常量区,把字符串的首地址放在指针变量中,只能读,不能写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值