我在C中学习指向(整个)数组的指针。
假设我声明了一个2d的整数矩阵:
int arr[3][3] =
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
现在,我声明一个适当类型的指针:
int (*ptr)[3][3];
初始化:
ptr = &arr;
现在,ptr包含arr的地址。
ptr --->&(arr[0][0] arr[0][1] arr[0][2]
arr[1][0] arr[1][1] arr[1][2]
arr[2][0] arr[2][1] arr[2][2])
那么,当我们取消引用ptr时,它应该产生第一个位置,不是吗?
printf("%d", *ptr)
在编译时出错。要打印第一个元素,我要使用***ptr
。
我有两个问题:
*ptr
没有指向数组的第一个元素,那么它指向的是什么
到?答案 0 :(得分:2)
printf(*ptr);
是错误的,因为printf
的第一个参数需要是一个字符串,指定用于打印其余参数的格式。要打印地址,请使用:
printf("%p", *ptr);
我无法理解三重解除引用的必要性。
p
的类型为int (*)[3][3]
。
*p
的类型为int [3][3]
。
**p
的类型为int [3]
***p
的类型为int
。
当你有这样的指针时,最好使用数组语法。
(*p)[0][0]
通用表格将是:
(*p)[i][j]
与使用***p
相比,这更令人困惑。此外,***p
只能用于访问数组的[0][0]-th
元素。
如果
*ptr
没有指向数组的第一个元素,它指向什么?
希望上一个问题的答案能够解释这一点。