首页 > 试题广场 >

int a[3][4],下面哪个不能表示 a[1][1]?

[单选题]
数组a的定义为:int a[3][4]; 下面哪个不能表示 a[1][1] ?
  • *(&a[0][0]+5)
  • *(*(a+1)+1)
  • *(&a[1]+1)
  • *(a[1]+1)
在二维数组中a[1]表示的是a[1][0]的地址,数组在内存中连续存储,所以a[1]+1表示的是a[1][1]的地址,所以D可以取得正确的值;
指针操作*(a+1)与a[1]等价,所以B也可以取得正确的值;
二维数组在内存中是行优先存储的,所以A中a[0][0]的地址加5可以取得正确值;
C选项错误,应改为*(&a[1][0]+1),因为a[1]就表示a[1][0]的地址。
发表于 2015-08-20 23:29:20 回复(5)
对于二维数组a[m][n]而言,a和a[0]都是首地址等价于&a[0][0],不同之处在于a+1移动至下一行,而a[0]+1移动至下一列。即a+1指针指到a[1][0]处,而a[0]+1指针指到a[0][1];
发表于 2017-02-17 20:31:36 回复(2)
*(*(&a[1]+1))表示a[2][0]的值,也就是*(&a[1]+1)是a[2][0]的地址
发表于 2015-09-02 23:41:53 回复(5)
选项A,很容易判断
选项B,*(a+1) == a[1] == a[1][0]的地址, *(*(a+1)+1) == a[1][0]
选项C,&a[1]+1,因为&a[1]指向第1行这个1*4的一维数组,&a[1]+1则指向第2行这个二维数组,所以*(&a[1]+1) == a[2],为第2行的地址
选项D,a[1] == &a[1][0], *(a[1]+1) == a[1][0]
http://www.cnblogs.com/letgo/p/5760851.html
发表于 2016-08-11 14:35:01 回复(2)
解释前面都说了,大致补充一下:
&a[1]+1,将a[1]看成一个整体,它的类型其实是int [4],1为1个单位,这时1个单位为int [4],所以+1即向后移4,即指向a[2][0]地址处,所以*(&a[1]+1)的值为a[2][0]
发表于 2017-09-06 19:11:04 回复(0)
C和D都是错误的,CD编译都不通过
要想正确,C应该改成 *((int *)&a[1]+1)
D 应该改成,*((int*)a+5)
发表于 2015-07-06 10:52:26 回复(1)
c;对数组名取地址虽然值和数组第一项相同,但其表示的是整个数组的地址,做+1操作时其值加的是整数组的长度*sizeof(数组元素),这里二维数组是一个道理
发表于 2016-09-28 16:15:08 回复(0)
&a[1]其实就是a+1解引用,然后再取地址,得到的结果其实就是a+1
所以&a[1]+1 = a+2
*(a+2)
结果等于&a[2][0]
发表于 2020-04-04 01:29:07 回复(1)
  1. A 因为数组是连续存储的,a[1][1]实际上是第5个元素,而&a[0][0] + 5就是跳5个指针所指对象的步长,这里的指针所指对象是int,所以跳4*5字节长度,与&a[1][1]的地址相等,使用解引用运算符就正确引用了a[1][1],A正确
  2. B 我们从内向外看,a+1这个表达式,a退化成指向a首元素也就是a[0]的地址,a[0]是一个元素个数为4的一维数组,a+1就跳过指针所指对象的步长,也就是1 * sizeof(a[0])的字节长度,得到指向一维数组a[1]的地址,对他解引用得到a[1],a[1]相当于数组名,退化成指向数组首元素的指针,对他+1,跳过一个int字节的步长,得到a[1][1]的地址,解引用得到a[1][1],B正确
  3. C   &a[1]得到指向a第2个元素的地址,也就是指向一个一维数组,对他进行加1,跳过的步长是一个一维数组的大小,也就是sizeof(a[0]的大小)得到的结果是&a[2],也就是指向a的第三个元素,对他解引用获得a[2],退化成指针指向a[2][0],结果是一个地址,所以C错误
  4. D a[1]是a的第二个元素,也就是元素大小为4的一维数组,相当于数组名,所以会退化成指向a[1][0]的指针,对他进行加1,再解引用,就获得了a[1][1],所以D也正确
发表于 2018-11-20 14:50:58 回复(0)
a==&a[0] a[0]==&a[0][0]
发表于 2018-03-02 10:16:47 回复(0)

int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };

A:a[0][0]返回值1,取地址后&a[0][0]返回的是一个int*类型的指针,加上5后指针往后走5个元素,因为数组是按行存储的,因此最后指向元素6,也就是a[1][1]的地方,解引用就得到6

B:a[1]其实等价于*(a + 1),那么a[1][1]等价于*(*(a + 1) + 1)a[1][1][1]等价于*(*(*(a + 1) + 1))。。。以此类推

C:a[1]返回一个int*类型的指针,再对这个指针取地址&a[1],会得到一个int (*p)[4],即一个指向含有4个元素数组的指针,本例中指向数组{5, 6, 7, 8},对这个指针加1,那么这个指针会指向下一个数组{9, 10, 11, 12},即一次走了4个元素(这里注意int*指针加的操作和int (*p)[4]指针加的操作的区别,前者每+1就往后走一个元素,后者+1就往后走四个元素),最后解引用得到的是一个指向元素9的int*型的指针,也就是a[2][0],因此错误,而且就算要得到a[2][0],也应该解引用两次**(&a[1]+1)

D:同样的,可以写成*(*(a + 1) + 1),和B相同

编辑于 2022-12-02 09:43:53 回复(2)
在二维数组中,a[0]、a[1]就表示a[0][0]、a[1][0]的地址。对于指针的指向一定要弄清楚,不要理解错了。
发表于 2016-05-23 14:34:32 回复(0)
关键是:对于二维数组,a[n]表示a[n][0]的地址,又*(a+1)表示a[1],所以B对
发表于 2021-02-25 15:34:32 回复(0)
链接:https://www.nowcoder.com/questionTerminal/2b66de6a28234cd4ab8050c096476b92
来源:牛客网
A     二维数组在内存中是行优先存储的,所以a[0][0]的地址加5可以取得正确值
B    数组名a 是一个二级指针 ,所以a[1] 等价于*(a+1)
C    &a[1]+1,将a[1]看成一个整体,它的类型其实是int [4],1为1个单位,这时1个单位为int [4],所以+1即向后移4,即指向a[2][0]地址处,所以*(&a[1]+1)的值为a[2][0]
D    a[1] == &a[1][0], *(a[1]+1) == a[1][0]
二维数组中 a[1]+1和 &a[1]+1的区别:
a[1]是int *类型,而&a[1]是int (*)[4]类型。因此同样加1的时候,偏移不一样。前者只移一位,而后者要移动四位(一行),即到二位数组的下一行。
 
发表于 2020-03-06 13:22:15 回复(0)
只有C是错的!
发表于 2017-09-28 09:55:00 回复(0)
原来如此
发表于 2017-03-14 23:21:58 回复(0)
C D  C是a[2][0]的地址
     D是超出了数组
发表于 2015-05-04 19:29:53 回复(0)
C D 都不对吧
C: &a[1]取第一行首地址,&a[1]+1只是往后移动一个字节
D: a+5 直接到第5行了。


发表于 2015-04-29 17:04:01 回复(0)

A. *(&a[0][0] + 5):这个表达式通过取 a[0][0] 的地址并加上 5,然后使用间接引用运算符 * 来访问该地址的值。由于 a[0][0] 是二维数组的第一个元素,所以它的地址加上 5 实际上是 a[1][1] 的地址,因此这个表达式可以表示 a[1][1]。

B. ((a+1) + 1):这个表达式先将 a 的地址加上 1,得到 a[1] 的地址,然后再将该地址加上 1,得到 a[1][1] 的地址。使用间接引用运算符 * 可以访问该地址的值,因此这个表达式也可以表示 a[1][1]。

D. *(a[1] + 1):这个表达式先获取 a[1] 的地址,然后将该地址加上 1,得到 a[1][1] 的地址。使用间接引用运算符 * 可以访问该地址的值,所以这个表达式同样可以表示 a[1][1]。

选项 C. (&a[1] + 1):这个表达式通过取 a[1] 的地址并加上 1,然后使用间接引用运算符 * 来访问该地址的值。这里的问题在于,a[1] 是一个长度为 4 的一维数组,(&a[1] + 1) 的结果将是 a[2] 的地址,而不是 a[1][1] 的地址。因此,选项 C 不能表示 a[1][1]。

发表于 2023-10-31 09:29:14 回复(0)
int a[3][4]={1,2,3,4,
                 6,7,8,9,
                 11,12,13,14,
                 };
    std::cout<<*(&a[0][0])<<std::endl;
    std::cout<<*(&a[0][0]+5)<<std::endl;
    std::cout<<*(*(a+1)+1)<<std::endl;
    std::cout<<**(&a[1]+1)<<std::endl;
    std::cout<<*(a[1]+1)<<std::endl;
1
7
7
11
7
&a[0][0]+5个位置刚好a[1][1]
*(&a[1]+1)代表指针地址,&a[1]是6的地址,+1变成11

发表于 2023-04-17 09:30:19 回复(0)