如何解释C中数组的指针



考虑:

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,依此类推

相关内容

  • 没有找到相关文章

最新更新