Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46331
  • 博文数量: 13
  • 博客积分: 563
  • 博客等级: 下士
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-18 14:45
文章存档

2014年(1)

2011年(2)

2010年(2)

2009年(8)

分类: C/C++

2009-08-23 21:32:10

一、宏定义
   程序在预处理的时候,执行的内容就有宏定义,而在C语言中宏定义有三种表达形式:
   

1、
#ifdef 标识符 //定义了宏就执行语句一

     语句一
#else
     语句二
#endif
2、
#ifndef 标识符 //没有定义宏就执行语句一

     语句一
#else
     语句二
#endif
3、
#if 表达式 //表达式成立就执行语句一

    语句一
#else
    语句二
#endif


一般出考点的地方就在宏定义上,例如
#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修饰的变量和函数只能作用与此函数或此文件中;以下分别为三个.c 文件,分析程序运行的结果:

a.c; 
    
extern int va;
    
int main(void)
    
{
        
printf(” %d”, va* getO()*getG(););
    
}
b
.c: 
    
static int va = 18;
    
static int getG(void)
   
{
       
return va;
   
}
    
int getO(void)
   
{
       
return getG();
    
} 
c
.c:
    
int va = 7;
    
int getG(void)
    
{
        
int va = 20;
        
return va;
    
}

根据以上的解释,当寻找va的值时,由于b.c中定义了static,所以引用了c.c中的值 7 ;当寻找get0()函数时,在b.c中,返回的getG()在本函数中定义的为静态的,所以getG()应是b.c 中的,返回va值也应是b.c 中的;最后调用的应该是c.c 的getG(),分析后得出答案应该是
               7 * 18 * 20 = 2520;

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

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



阅读(723) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~