指针和数组的区别及混淆

 

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");

详见:char* a和char a[]的区别

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;

这下明白了吧。其实指针的指针也就这么回事。

 

 

 

 

原文地址:https://www.cnblogs.com/zhanbiqiang/p/4023644.html