首页 > 编程语言 > 详细

C语言各种变量存储方式

时间:2015-03-20 16:26:13      阅读:298      评论:0      收藏:0      [点我收藏+]

1、变量类型:

C语言的变量分为局部变量和全局变量。
1.局部变量:
指在函数内部或者块内部(即一对花括号包含的区域)[以下均称为块]定义的变量,只对块范围内有效。
特点:不同块中可以有同名变量名,代表不同的变量,互不干扰;函数形参也是局部变量。
2.全局变量:
在函数之外定义的变量,从定义处开始到文件结束均有效,当然可以使用extern修饰将其范围扩大到其他文件。
特点:如果局部变量和全局变量同名,那么在局部变量作用范围内外部变量不起作用;在不必要是尽量不要使用全局变量,因为其降低了函数的通用性。

2、实验

另外加上static和const关键字之后,这些变量又是怎么存储的呢?下面的代码在linux系统调试通过:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
  int int_a=1; 
  static int static_int_a=2;
  const  int const_int_a=3;
int main ()
{
  int int_b=1; 
  static int static_int_b=2;
  const  int const_int_b=3;
  int *p1=malloc(4);

  printf("       int_a: %p\n",&int_a);
  printf("static_int_a: %p\n",&static_int_a);
  printf(" const_int_a: %p\n",&const_int_a);
  printf("       int_b: %p\n",&int_b);
  printf("static_int_b: %p\n",&static_int_b);
  printf(" const_int_b: %p\n",&const_int_b);
  printf("           p: %p\n",&p1);
  printf("        main: %p\n",main);

 printf("%d\n",getpid());
 while (1);
}

下图是调试结果:

技术分享

下图是程序运行时的maps文件:
技术分享

3、结果

通过上面的代码实验可以看出
1、 普通全局变量和static修饰的全局变量存放在全局区(程序运行时把这些数据存进栈中),但是const修饰的全局变量存放在代码区(程序运行时该数据存在只读Memory中)。
2、 普通局部变量和const修饰的局部变量存放在栈里面,但是static修饰的存放在了全局区。

4、杂记

一、const修饰符
1.修饰的变量必须初始化:

 const int i=1;//合法
    const int j;//非法

2.被修饰的变量只能被读:

 const int i=1;
    int j=2;
    i=j;//非法
    j=i;//合法

3.可以避免不必要的内存分配:

 #define STR "abcdef"
    const char str[]="abcdef";    
    printf(STR);//为STR第一次分配内存
    printf(str);//为str一次分配内存
    printf(STR);//为STR第二次分配内存
    printf(str);//已经不需要分配内存了    
同样是一个常量字符串,宏定义在编译时候自动替换了,所以实际是很多的常量。

4.数值常量和指针常量区分:

    int x=1;
    const int y=2;          //y是常量,初始化之后就不能修改y值了
    const int *p1=&x;       //p1指向的内容是常量,不可以修改
    int * const p2=&x;      //指针p2是常量,所指向的内容可修改
    const int * const p3=&x;//指针p3和p3指向的内容均不可以修改
    p1=&y;//合法
    *p2=3;//合法

5.const的常量未必一定不可以修改

   const int x=1;
    int *p=(int*)&x;
    *p=2;//   此时的x的值便被修改为2了

C语言各种变量存储方式

原文:http://blog.csdn.net/hjxzb/article/details/44492205

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!