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]

posted @ 2022-03-08 12:30  east-dong  阅读(245)  评论(0)    收藏  举报