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了
时间: 2024-08-29 20:55:02

C语言各种变量存储方式的相关文章

IOS开发系列--C语言之生存储方式和作用域

概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用域和可访问性. 变量作用范围 存储方式 可访问性 变量作用范围 在C语言中变量从作用范围包括全局变量和局部变量.全局变量在定义之后所有的函数中均可以使用,只要前面的代码修改了,那么后面的代码中再使用就是修改后的值:局部变量的作用范围一般在一个函数内部(通常在一对大括号{}内),外面的程序无法访问它,

C语言之局部变量&amp;全局变量&amp;变量存储方式

一.角度分析: 变量作用域 -------> 局部变量和全局变量 变量存在的生存期 ---------> 静态存储方式和动态存储方式 二.局部变量: 局部变量也称为内部变量.局部变量是在函数内作定义说明的.其作用域仅限于函数内,离开函数后再使用这种变量是非法的. 例子: 关于局部变量的作用域还要说明以下几点: 1)主函数也是一个函数,它与其他函数是平行关系.主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用.同时,主函数中也不能使用其他函数中定义的变量. 2)形参变量是属于被调函数的

C语言中变量存储类型有哪些?

变量的存储类型是C语言的重要组成部分,也是C语言学习的基础.那C语言中变量的存储类型有哪几种呢?在编程过程中又该怎样运用呢?就这一问题,我今天给大家介绍一下!总的来说,C语言中变量的存储类型可以分为四种,他们分别是自动变量.静态变量.外部变量和寄存器变量这四种,他们的说明符依次是:auto.static.extern和register. 一.auto auto称为自动变量. 局部变量是指在函数内部说明的变量(有时也称为自动变量).用关键字auto进行说明,当auto省略时,所有的非全程变量都被认

go语言返回变量存储地址

1 package main 2 3 import "fmt" 4 5 func main() { 6 e:=51 7 fmt.Println(e) 8 fmt.Println(&e) //&e; 将给出变量的实际地址. 0xc04203c1d0 9 }

【精】C语言之变量存储类型

C++中的数据存储方式自动存储、静态存储和动态存储

C++中变量存储方式有三种,自动存储,静态存储,动态存储 自动存储简单意义上就是在函数内不用任何关键字直接定义的变量,它在函数被调用时被创建,在函数退出时自动消失, 静态存储顾名思义就是在程序的整个运行过程中都存在,在函数体外定义的变量自动为静态存储方式,也可以在函数内使用static关键字定义 动态存储是以关键字new和delete构成的,在程序运行过程中需要时通过new现场分配指定大小的空间,不再需要时使用delete来释放

堆/栈/动态存储方式/静态存储方式

动态存储方式 所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式.动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放. 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放.如果一个函数被多次调用,则反复地分配. 释放形参变量的存储单元. 静态存储方式 所谓静态存储方式是指在程序编译期间分配固定的存储空间的方式.该存储方式通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束

C语言之变量类型和存储方式

变量可以分为全局变量.静态全局变量.局部变量和静态局部变量 变量的声明有两种情况: 1.一种是需要建立存储空间的(定义性声明).例如int a 在生命的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的(引用性声明).例如extern int a 其中变量a是在别的文件中定义的. 内存区域的划分: 1.栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值.局部变量等. 2.堆区:程序员向系统申请或释放. 3.全局区:用来保存全局变量和静态变量. 4.文字常量区:用来保存常量字符

1005------C语言-----------C语言变量的存储方式解析

0.背景 在看APUE第七章的时候,作者分析了setjmp和longjmp这种函数间跳转机制对不同存储类型变量的影响,看到register,auto,volatile,static等等这些关键字很模糊,也可能太少用了,但是自认为C语言基础不错的我还是不能接受任何不懂的知识点,于是就捋了捋思路. 1.C语言变量的基本属性 在C语言中,每一个变量都有3个属性: (1)类型,就是常用的int.char等,它确定了变量存储长度和运算方式: (2)作用域,根据变量所处的位置分为全局变量和局部变量: (3)