C语言各种变量存储方式

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了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值