取消引用指向整个数组的指针

时间:2015-10-25 05:45:10

标签: c arrays pointers

我在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

我有两个问题:

  1. 我无法理解三重解除引用的必要性。
  2. 如果*ptr没有指向数组的第一个元素,那么它指向的是什么 到?

1 个答案:

答案 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没有指向数组的第一个元素,它指向什么?

希望上一个问题的答案能够解释这一点。