考虑:
void print_array(int(*p)[10], int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", (*p)[i]);
}
}
int main()
{
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++)
{
arr[i] = i;
}
int(*p)[10] = arr;
print_array(p, len);
return 0;
}
为什么print_array函数的代码可以打印数组的信息?
我没有意识到代码(*p)[i]
,所以我希望程序员大师能帮我解决这个问题。
我想我不理解这段代码的原因是我没有意识到数组指针的知识。
让我们从这一行开始
int(*p)[10] = arr;
用作初始值设定项的数组arr
被隐式转换为指向其类型为int *
的第一个元素的指针。
然而,初始化的指针p
具有类型int ( * )[10]
,并且在这两个指针之间不存在隐式转换。
因此编译器至少应该发出一个警告。
你必须写
int(*p)[10] = &arr;
另一方面,表达式arr
和&arr
的值彼此相等。它是数组占用的内存范围的初始地址。(数组的第一个元素的地址等于数组作为整个对象的地址(。
因此,函数接受一个指向数组的类型为int ( * )[10]
的指针。
取消引用表达式(*p)
中的指针,可以得到类型为int[10]
的对象(指针指向的数组(,该对象是数组类型的对象。
因此,您可以应用下标运算符(*p)[i]
来访问数组的元素。
p
是指向10个元素int
数组的指针。
(*p)[i]
首先,取消引用指针p
,得到10个整数的数组。然后访问数组的第i
个元素。
数组是一个连续的内存分配,因此语句int(*p)[10] = arr;
创建一个指针数组,其中p[0]指向数组的第一个元素。
现在在函数调用中,*p[i]引导*(p+i(。它继续递增,因此它将继续打印阵列元素1、2、3,依此类推