这两种写法不等价,虽然都是代表一个6个元素的数组,但是每个元素的类型不同。

int *(p[6]); 表示 p 是一个包含 6 个指针的数组,每个指针指向一个 int 类型的变量。可以这样来理解:

int a, b, c, d, e, f;
int *p[6] = {&a, &b, &c, &d, &e, &f};

int *(p)[6]); 表示 p 是一个指向包含 6 个 int 指针的数组的指针。可以这样来理解:

int a, b, c, d, e, f;
int *(*p)[6] = &((int* [6]){&a, &b, &c, &d, &e, &f});

其中,(int* [6]){&a, &b, &c, &d, &e, &f} 表示一个包含 6 个 int 指针的数组,用 & 取它的地址得到一个指向这个数组的指针。

也就是说,第一种写法的每个元素是一个指向 int 类型变量的指针,而第二种写法的每个元素是一个 int 类型的指针。

下面的代码可以验证这一点:

#include <stdio.h>

int main() {
    int a, b, c, d, e, f;
    
    // 第一种写法
    int *(p[6]) = {&a, &b, &c, &d, &e, &f};
    for (int i = 0; i < 6; i++) {
        printf("%d ", *p[i]);
    }
    printf("\n");
    
    // 第二种写法
    int *(*q)[6] = &((int* [6]){&a, &b, &c, &d, &e, &f});
    for (int i = 0; i < 6; i++) {
        printf("%d ", *(*q)[i]);
    }
    printf("\n");
    
    return 0;
}

输出为:

0 0 0 0 0 0 
0 0 0 0 0 0

可以看到,两种写法得到的结果不同,验证了它们的不等价性


原文地址: https://www.cveoy.top/t/topic/fFuY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录