美文网首页
int (*p)[3] 和 int *p[3] 的区别

int (*p)[3] 和 int *p[3] 的区别

作者: vancymoon | 来源:发表于2019-05-15 19:20 被阅读0次

    在分析表达式的时候,我们还是需要关注运算符的优先级,才能得到正确的类型

    int *p[3]

    这种定义方式是我们非常熟悉的一种。

    可以看出,定义数组的 [] 的优先级还是要高于定义指针的 * 的优先级的,所以 int *p[3] 中,我们关注变量名 p,它首先被解释为一个数组,然后这个数组的内容(每一个元素)都是 int * 类型

    image.png

    int (*p)[3]

    先说下结论:p 指向一个数组

    对于 int (*p)[3],我们关注的对象 p 首先被括号括了起来:(*p),所以它首先被解释成了一个指针,而这个指针指向的内容,则是括号外所表示的内容:int [3],即一个长度为 3 的数组,所以指针 p 指向一块内存区域(请把它指向的内容看做一个整体)

    image.png

    与数组对比,有一些更有意思的发现,如:

    int q[3];
    int* p1 = q;
    int (*p2)[3] = &q;  // &q 的数据类型是 int (*)[3],实际上是吧全体数组元素当做一个整体来看待
    std::cout << p[0][0] << std::endl;  // 1
    

    也就是说 p2 的类型与 &q 的类型相同,差不多可以看做一个二维指针,例如:

    int q[6] = { 1,2,3,4,5,6 };
    int(*p)[3] = (int(*)[3])q;
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            std::cout << p[i][j] << " ";
        }
        std::cout << std::endl;
    }
    

    输出:

    1 2 3
    4 5 6
    

    相关文章

      网友评论

          本文标题:int (*p)[3] 和 int *p[3] 的区别

          本文链接:https://www.haomeiwen.com/subject/fbvmaqtx.html