📜  int (*p)[3] 和 int* p[3] 之间的区别?(1)

📅  最后修改于: 2023-12-03 14:42:07.664000             🧑  作者: Mango

区别介绍

在C语言中,指针是一种十分重要的概念。常常会出现int (*p)[3]int* p[3] 两者混淆的情况,它们之间有什么区别呢?

  • int (*p)[3] 是一个指向数组的指针,这个数组是有3个元素,元素类型是int。也可以理解为这个指针指向了一个有3个int类型元素的数组。
  • int* p[3] 是一个指针数组,它包含有3个指针元素,每个指针元素的类型是int*(即指向int类型的指针)。

讲解时可以画图加以区别:

1. int (*p)[3]

|        p    |
|    --------->
| [0] | [1] | [2] |
|  X  |  X  |  X  |

2. int *p[3]

|        p   |         |         |
| [0]: ----->|  [1]: -----> | [2]: ---->|
| [0] | [1] |    [0] | [1] |  [0] | [1]| 
|  X  |  X  |     X  |  X  |   X  |  X |
示例代码
#include <stdio.h>

int main() {
    int a[3][3] = {1,2,3,4,5,6,7,8,9}; // 二维数组
    int (*p)[3] = a; // 指向数组的指针

    int b[3] = {4,5,6};
    int c[3] = {7,8,9};
    int* arr[3] = {b,c,a[0]}; // 指针数组
    
    printf("a[1][2]: %d\n", p[1][2]);
    printf("*arr[2]: %d\n", *arr[2]);
    return 0;
}

在上面的示例代码中,int (*p)[3] 指向了二维数组 a,而 int* arr[3] 则是一个指针数组,包含了指针 bc 以及 a[0] 中第一个元素的指针。