新人小白帖,急求解。。。。!

int a[4][3] = { 1,2,3,4,5,6,7,8.9,10,11,12 };
int(*pt)[3] = a;
cout << (*(pt + 1)[2]) << endl;
return 0;

本人是小白,刚刚开通博客,所以没办法给大家悬赏c币,请大家见谅,想问一下这个结果为什么是11.

很有欺骗性的题目,应该是8,9
不是8.9 标点符号错误了。

修改后正确的答案应该是10

1 2 3 //第0行
4 5 6
7 8 9
10 11 12 //第3行

首先pt 是行指针 ( 之前有个您问的问题,可以结合理解)
解释一下(pt + 1)[2], pt+1指向第一行,[]运算符优先级大于* , (pt + 1)[2] = (pt+0)[3] = pt[3],即指向第三行行首。

这种写法对初学者不友好,不提倡。
然后 *(pt + 1)[2] 等同于 * ( pt[3] + 0 ) ,即取第三行第0列的元素,答案是10

一种好理解的写法如下:

int main()
{
    int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, (*p)[4], i, j;
    p = a;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++)
            printf("%d ", *(*(p + i) + j));
    return 0;
}

如果对您有帮助,请点击采纳答案好吗,谢谢~~

那个题主是不是写错了 应该是8和9 , 不是8.9

如果写错的话,
在语句:int (*pt)[3];中 "int" 说明数据类型是int;"( )"和"[ ]"的优先级最高,但是从左向右结合的,所以先执行“( )”里面的内容,声明一个指针,接着执行"[3]"再说明是指向有3个元素的数组。综合就是“声明一个指向类型为int,有3个元素的数组的指针pt”;pt是指向一维数组的指针变量
也就是
1 2 3
4 5 6
7 8 9
10 11 12
*(pt)[0] = 1;
*(pt)[1] = 4;
*(pt)[2] = 7;
*(pt)[3] = 10;
所以说pt数组可以看成是 存储二维数组中每一行的首地址的一个数组

有一个很相似的题,我有解题过程,希望你可以看懂。但是你这个题中有一点点不同,就是输出的时候变成了[2],所以就又变为了一个有两列的指向整形的数组指针,。。这个图就是一个类似的题,希望你可以懂我的意思☺图片