您的位置:首页 > 编程语言 > C语言/C++

浅谈C语言中变量、常量、数组、字符串、指针的地址

2017-07-13 14:34 471 查看
要认清这些数据类型在内存中的分配情况,我们应该先来讲解下内存;

一个程序在内存中分三个段:数据段、代码段、堆栈

一个程序在内存中也可以分为四个区:堆区、栈区、全局变量区、常量区、代码区   (第二种更好理解)

常量区和代码区在代码段。

堆区:由new申请的内存就归在堆段,该段有程序员手动申请,用完后须手动释放delete;它在内存中分配不连续,类似链表;

栈区:用来存放局部变量,无须手动释放,它在内存中分配连续;

全局变量区:用来存放全局变量和静态变量,他分为2块,一块用来存粗初始化过得变量,一块用来存储未初始化后的变量;(前者占内存,后者程序运行时才分配内存)

常量: 用来存储字符串常量和实型常量,字符型常量

代码区: 用来存放程序代码

下面来介绍各个变量

实型

int a=0; //int是四个字节

系统划分了一个地址区间[-1076093088,-1076093084],    //这边即下面的地址都是我随机分配的,

该地址区间的名字叫a;

该地址区间存放的内容是0;

int a[10]={1,2};

系统划分了一个地址区间[-1076093128,-1076093040],

该区间依次用a[0]到a[10]命名,

其中a[0]即[-1076093128,-1076093125]中存放的内容是1;

a[1]即[-1076093124,-1076093121]中存放的内容是2;

a[0]+1==a[1];

其他中内容为0;tip:若定义a[10]时未定义内容,则里面都是随机数。当数组值超过当初定义的量时,如a[11]=1,那么默认会往下面的地址接着写,但编译会提示出现段错误,可能会影响其他变量

其中a代表了[-1076093128,-1076093040]这个地址,

当b以%d输出时输出的是-1076093128,当&b以%d输出时结果是-1076093128。

 a[0]地址为-1076093128,a[0]的内容为1

但是[-1076093128,-1076093125]里的内容只有1,没有-1076093128这个数据;

相当于:a并没有指向a地址下的内容,而是直接指向地址;

所以a!=a[0];   a==&a[0] ;

 a可以直接赋值给指针  int *b;b=a; 并且*a指向a[0]

并且a只有读的权限,它是个常数;

你可以把数组名看成一个可以占任意大小内存一维常量指针

int b=1,*a=&b;

这条语句等于int *a,b=1;     //指针都是四个字节

a=&b;   或者
*a=b;

一维指针可以指向任何非指针和数组名的实型变量或常量;

a在系统内分配的地址区间是[-1074789552,-1074789549],

        b在系统内分配的地址区间是[-1074789512,-1074789509],

a的内容是-1074789512; //b的地址

字符型

char a='z';

系统划分了一个地址是-1074789597 //char只占一个字节

该地址区间的名字叫a;

该地址区间存放的内容是z;

char a[20];

a[0]='z';

a[1]='w';

       a代表了-1074752359的地址   

a[0]的地址是 -1074752359 它的内容是z

a[1]的地址是   -1074752358它的内容是w

当一个指针指向数组的其中一个地址时,以%s进行输出,它会输出以这个地址为始到数组末尾的值。不必使用*来指向该数组

char  *a,*b,*c,d='z',e[10]

b="my name"; //printf ("%s",b); 输出的是my nametip如果是*b则出现乱码

a=&d;

a=e   ==  a=&e[0]   ;

先介绍第一种: b在系统中被分配到的地址[-1080271884,-1080271881]  //四个字节

b的内容是134514320 //代表了字符串的地址,我们知道变量是存在栈里,而字符串则是在常量区

若b以%d输出则是134514320

      以%s输出则是    my name

      以%c输出则是 (空)

若*b输出则代表把字符串当成地址,如果字符串是一串地址数字,则可以指向该数字代表的地址内容

若b[0]以%c输出则是 m

   以%s输出则是段错误

第二种: a在系统中被分配到的地址[-1080271884,-1080271881] //四个字节

d在系统中被分配到的地址-1080271885  //一个字节
a的值是-1080271885

第三种:                 a在系统中被分配到的地址[-1080271884,-1080271881]  //四个字节

a的内容为e[0]的地址;

当指针指向一个数组或者字符串时:

如果你想输出之后的字符以%s,a进行输出

如果你只想输出这个字符以%c,*a进行输出

字符型指针赋值的时候不能如下赋值:

char *a,b;

*a="my"; 或者*a=b;

a未初始时,里面的值是随机的;

这样赋值会使这些随机地址被赋值,出现段错误;

除此之外再介绍一种常量 前缀consit 这种常量只能在定义的时候进行赋值

输出这些变量可以选择%d,%c,%s,%p等

%d 可以输出变量下的内容,以变量输入,以十进制输出

%c 可以输出变量下的内容,以变量输入,以单个字符输出

%s 可以输出地址上的字符串,直到出现‘\0'

%p 可以输出变量的地址,以&变量输入,十六进制输出

[b][b][/b][/b]

[b][/b]

[b][/b]

[b][/b]

[b][/b]

[b][/b]

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: