C语言中数组和指针的区别
数组和指针并不是相等的,例如,考虑下面这两个声明:
int a[5];
int* b;
把两个声明用图的方法来表示,可以发现它们之间有显著不同:

声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,a的值是一个常量,指向这段空间的起始位置;声明一个指针变量时,编译器只为指针本身保留内存空间,并不为任何整型值分配内存空间;此外,在这个例子中指针变量b并未被初始化为指向任何现有的内存空间
因此,上述声明后,表达式 *a 是完全合法的,但表达式*b是非法的,因为*b将访问内存中某个不确定的位置;另外,表达式b++可以通过编译,但a++不行,因为 a 的值是一个常量
为了加深对数组的理解,给出如下几组对等关系:
// 先声明一个数组array和指向数组第二个元素的指针ap
int array[10];
int* ap = array + 2;
ap == array+2 OR &array[2]
*ap == array[2] OR *(array+2)
ap[0] == *(ap+0) OR array[2] // C语言的下标引用与间接访问表达式是一样的
ap+6 == array+8 OR &array[8]
*ap+6 == array[2]+6
*(ap+6) == array[8]

浙公网安备 33010602011771号