首页 > 解决方案 > 指向数组的指针之间的区别

问题描述

这两个指针有什么区别?两个指针都指向一个数组?是不是因为第一个指针是指向数组第一个元素的指针,而另一个是指向 5 个元素的数组的指针?这对代码有什么影响?

int arr[5] = {1,2,3,4,5};
int *pointer = arr;
int (*pointer2)[5] = arr;

标签: c

解决方案


你的第一个声明

int *pointer = arr;

声明pointer为指向单个整数的指针。在初始化中,arr衰减为指向它的第一个元素的指针,所以它相当于

int *pointer = &arr[0];

第二个

int (*pointer2)[5] = arr;

声明pointer为指向 5 个整数数组的指针。初始化无效,因为arr衰减到指向单个整数的指针,而不是数组。您需要添加演员表:

int (*pointer2)[5] = (int(*)[5])arr;

或获取数组的地址(因为在获取数组的地址时不会发生指针衰减):

int (*pointer)[5] = &arr;

当您执行指针运算时,两种指针类型之间的差异会变得很明显,因为指针运算是以它所指向的类型的大小为增量执行的。pointer+1是指向 的指针arr[1],但pointer2[1]将是指向 的指针arr[5],它不存在。


推荐阅读