浅谈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]
一个程序在内存中分三个段:数据段、代码段、堆栈
一个程序在内存中也可以分为四个区:堆区、栈区、全局变量区、常量区、代码区 (第二种更好理解)
常量区和代码区在代码段。
堆区:由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]
相关文章推荐
- char * 与 char [] 区别,char *[] 与 char[][]区别。字符串指针的数组与二维char数组区别。字符串常量赋予指针与字符数组区别。"字符串"等价于其首元素"字"的地址
- C语言回顾(六、基类型,数组指针,字符串指针,函数指针,文字常量区)——iOS开发基础
- C语言字符串指针变量与字符数组的区别
- C语言----变量及作用域 、 指针 、 指针和数组 、 进程空间 、 字符串
- C语言字符串指针变量与字符数组的区别
- C语言中字符数组和字符串指针分析
- C语言中变量的地址是一个常量
- C语言中字符数组和字符串指针分析
- c语言复杂变量声明(数组、指针、函数)
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- 指针和数组、字符串 | C语言教程 | C语言系列教程
- 使用字符串指针变量与字符数组的区别
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言返璞归真之修改const常量和使用变量定义数组长度
- C语言中字符数组和字符串指针分析
- 如果从函数中返回局部变量的地址,引用或者指针的形式,则变量类型必须是静态的或者常量,即不在栈中存储
- C语言中字符数组和字符串指针分析