c - (*b)[0] 与 *b[0] - 数组和指针

标签 c arrays pointers

我正在解决玩具问题以了解 C 中指针和数组之间的区别,我偶然发现了一些我还无法理解或找到答案的东西。

我有以下程序

#include <stdio.h>

int main()
{
    int a[3][3] = {{1, 2, 3}, {4, 5,6}, {7, 8, 9}};
    int (*b)[3];

    b = a;

    printf("%d %d %d\n", (*b)[0], (*b)[1], (*b)[2]);
    printf("%d %d %d\n", *b[0], *b[1], *b[2]);

    b++;
    printf("%d %d %d\n", (*b)[0], (*b)[1], (*b)[2]);

    b++;
    printf("%d %d %d\n", (*b)[0], (*b)[1], (*b)[2]);

    return 0;
}

当我编译并运行它时,我得到了这个:

me@mac: clang -g q.c -o q.o                                                                     
me@mac: ./q.o
1 2 3
1 4 7
4 5 6
7 8 9

我的问题是 (*b)[0]*b[0] 有什么区别?看起来前者是 int * 类型,而后者是 int *[3] 类型。如何解释运算符 *[]() 来理解这个?

最佳答案

int (*b)[3]; 是一个数组指针,一种特殊的指针,可以指向整个数组而不仅仅是第一个元素.不要与 int *b[3] 混淆,后者是 3 个指针的数组,不存在于您的代码中。

b=a 将 b 设置为指向二维数组 a 中的第一个元素,这是一个一维数组。

当你解引用一个数组指针时,你得到了数组。当在表达式中使用数组时,它“衰减”为指向第一个元素的指针,这解释了第一行 printf。

如果你写*b[0],那么[]的运算符优先级高于*,所以它的意思是“给我数组编号0,它会衰减成指向第一个元素的指针,给我那个元素的内容”。

对于任何指针类型,包括数组指针,b的指针递增遵循指针算法的规则:增加地址使得指针指向指向类型中的下一个相邻项内存。也就是说,将地址增加 sizeof(*b) 个字节,在本例中为 3*sizeof(int)

关于c - (*b)[0] 与 *b[0] - 数组和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34390643/

相关文章:

c - C传递结构作为函数参数

c - 要求用户为数组的每个元素输入一个整数值

c++ - 重用 Lua 解析器的最佳方式是什么?

arrays - bash 字符串,以空格分隔,到数组

c++ - 什么决定了 C 中整数的大小?

php - Jquery,在每个循环中向数组添加值

java - 如何制作一个Java猜谜游戏程序

c++ - 带结构的 C pthread

C++:指针、循环变量和结构的问题

c++ - 在 C++ 中何时返回指针、标量和引用?