指针和数组的区别及混淆
1.char* a和char a[]
指针是不分配内存的,它指向的是系统的只读的内存,而数组是分配内存的,就是将系统的只读的内存里面的值复制到它的内存里面,因此可读写。
char p[]="abc123ABC"
char *p="abc123ABC";
char* p是定义的一个指针。。他指向的字符窜"abc123ABC" 是存在不可修改的区域(代码区)的。。 而char p[]是一个数组。。他的内容存在栈区可以修改
char p[]="abc123ABC"; //这个在常量区分配一个空间,然后又在栈上分配一个空间,将常量区的内容复制过来,所以可以修改
字符指针变量p指向字符串常量"abc123ABC"的首地址 字符串常量存放在数据区的“常量段” 所以当你访问并修改时会内存出错
正确的操作应该是:
char * p = (char * )malloc(10);
strcpy(p, "abc123ABC");
2.char *a[N] 和char (*a)[N]
char *a[N]:由于[ ]比*优先级要高,因此a先与[n]结合,形成a[n]形式,这显然是数组形式,它有n个元素。然后和*结合,*表示此数组是指针类型的,每个数组元素都指向一个char型的变量。
char (*a)[N]:指针a指向的对象是有N个char元素的数组,即a是指向一维数组的指针。也即,此时a只能指向一个包含n个元素的一维数组,a的值就是一维数组的起始地址。
3.int **a[3][4]
int **a[3][4] 表示一个二维数组,每个元素都是指向指针的指针。如何理解呢?举个例子:
int a =3;
int *p = &a;
int **q = &p;
这下明白了吧。其实指针的指针也就这么回事。