C语言中最容易出错的知识点

来源:互联网 发布:江苏省服务贸易数据 编辑:程序博客网 时间:2024/05/09 11:11
一、宏定义
   程序在预处理的时候,执行的内容就有宏定义,而在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;

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

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



阅读(284) | 评论(0) | 转发(0) |
0

上一篇:驱动学习总结

下一篇:麻烦牛人帮忙解释一下

相关热门文章
  • 记录一下ETIM_CLientUI程序在...
  • 怎么老是出错呀!大家帮我看看...
  • 【JAVA】设计模式之外观模式...
  • 好梦伴你让你15分钟轻松入睡,...
  • 运动前后注意 孩子少感冒...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • 我的ChinaUnix博客被锁定了,...
  • 虚拟机中ubuntu无线连接问题...
  • IBM DS3400 盘阵怎么查看是单...
  • 启动auditd时,报错如下,怎么...
  • CGSL系统中root密码正确,但无...
给主人留下些什么吧!~~
原创粉丝点击