一、C中的内存与变量的关系
内存中存在三个段,分别为Text,Bss,Data.
1.Text段
用于存放代码的
2.Bss段
用于存放未初始化的全局变量和静态变量
3.Data段
分为三个小段
a.静态区:用于存放初始化的全局变量,静态变量和常量(如字符常量)。
b.栈:用于存放一般的局部变量。
c.堆:用于存放动态分配的变量。
二、char *的理解
#include <stdio.h> int main() { char *p = "sample"; *(p + 4) = '1'; return ; }
这一段代码可以通过编译,但是程序运行的时候会在*(p+4)='1';这一段的时候崩溃,崩溃的原因在于char*定义的p是在栈中分配的一个指针,“sample”是一个在静态区分配了一块常量区,指针p指向了这块常量去,常量去是无法进行数据的更改的,所有在试图更改“sample”的时候程序会崩溃。
三、char[]的理解
#include <stdio.h>
int main() { char a[] = "sample"; a[1] = 'b'; printf("a=%s\n", a); return 0; }
程序可以正常运行,可以发现数组a的值成功的被改成了“sbmple”。但是当我们对数组指针a进行复制的时候,程序就无法编译通过了。
#include <stdio.h> int main() { char a[] = "sample"; a[1] = 'b'; printf("a=%s\n", a); char b[] = "book"; a = b; return 0; }
编译的结果是 a必须为可修改的值。产生这样的原因可以简单的理解数组的定义过程就是 a是一个指针常量,无法修改,而它指向的一段内存却是在栈区分配的,可以进行修改,是固定大小的一块内存,以‘\0’结尾。
三、char* 与char[]
可以通过一段小程序来理解他们直接的而不同
#include <stdio.h> #include <stdlib.h> #include<malloc.h> #include <string.h> int main() { char *c1 = "abc"; char *c4="abc"; char c2[] = "abc"; char *c3 = (char*)malloc(3); // *c3 = "abc" //error strcpy(c3, "abc"); c3[0] = 'g'; printf("%d %d %s\n", &c1, c1, c1); printf("%d %d %s\n", &c4, c4, c4); printf("%d %d %s\n", &c2, c2, c2); printf("%d %d %s\n", &c3, c3, c3); getchar(); return 0; }
输出结果:
6356748 4206628 abc
6356744 4206628 abc
6356740 6356740 abc
6356736 40381328 gbc
由输出结果我们可以看出,c1,和c4指向同一块内存,但他们的自身所在的位置是不同的。char* 和char[]初始化的地址也是不相同的。数值指针所在位置就是自己所指向的内存(有点绕,就是不可以改变的)