分类: C/C++
2009-08-23 21:32:10
|
#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修饰的变量和函数只能作用与此函数或此文件中;以下分别为三个.c 文件,分析程序运行的结果:
|
字符串指针,字符串存放在文字常量区,把字符串的首地址放在指针变量中,只能读,不能写。