首页 > 试题广场 >

下列程序的输出是( )。 #include in

[单选题]
下列程序的输出是()

#include <stdio.h>
int main(void) {
    int a[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p[4], i;
    for (i = 0; i < 4; i++) p[i] = &a[i * 3];
    printf("%d\n", p[3][2]);
    return 0;
}


  • 上述程序有错误
  • 6
  • 8
  • 12
int *p[4]: p 是指针数组, 数组内包含 4 个元素, 每个元素都是 int* 类型.

p[3] = &a[9], 即第 3 个元素是指向 a[9] 的

p[3][2] = p[3]+2, p[3] 是 int* 类型, 偏移 2 个单位后指向 a[11]
发表于 2018-07-24 09:29:04 回复(3)
应该都知道 *p[3] = a[9]吧,关键是printf("%d\n",p[3][2]);这里p[3][2]怎么理解
不要看到两个括号就以为它是个二维数组,然后a数组只有一维,就觉得题目有问题
事实是,C语言里,所有下标的表示法(如p[3]),最后都会转换成这种 *(p+3)
理解了这一点,那么,二维形式的  p[i][j]  会被转换成 *(*(p + i) + j),即:p[3][2]会被转化成 *(*(p +3) + 2)
*(p  + 3)是p[3]存的是a[9]的地址,在它基础上加2,由于*p是整型指针,+1 相当于往后移动一个整型的位置,那 +2 再取值就是a[11]的值了
发表于 2020-03-11 18:56:39 回复(2)
由for循环得:
p[0] = &a[0]    p[1] = &a[3]    p[2] = &a[6]   p[3] = &a[9]
对二位数组表达,有a[i][j] = *( *(a+i) + j ) = *( a[i] + j)
所以:p[3][2] = *( p[3] + 2) = *( &a[9] + 2) = a[11] = 12
发表于 2019-01-24 21:47:19 回复(0)
首先p数组是里面有4个元素,每个元素的值都是一个地址,分别指向a【0】,a【3】,a【6】,以及a【9】,问p【3】【2】的值。可以像这么看。p【3】是指向a【9】,其实p【3】何尝不可以看成指向“子”数组【10,11,12】的第一个元素的地址呢?那如果把该三个元素组成的数组取名b,即b【3】=【10,11,12】,既然p3是该数组的首地址,那么p3==b是吧?,那p【3】【2】不就是b【2】吗?也不就是12么。over!!!
发表于 2019-10-12 21:53:08 回复(0)
二维数组可以看做是一维数组的一维数组,由a[m]=a+m ; a[m][n]=a[m]+n=(a+m)+n 可知,p[3][2]=p[3]+2,
因为p是指针,所以p[3]+2代表指针p[3]的偏移量,结合p[3]=&a[9]可知,结果为12(a[11])
发表于 2018-11-04 13:51:22 回复(0)
我觉得p[3][2]可以看为*(&a[9]+2)
发表于 2018-06-04 11:46:25 回复(0)
在电脑上敲了一遍,答案确实是12
发表于 2018-05-09 17:22:31 回复(0)
p[3][2],是不是理解为将上面那串数组,拆成3列的二维数组?
1  2  3
4  5  6  
7  8  9
10  11  12
结果就刚好是四列。
然后p[3][2],就刚好是第四行第三列的值,就是12?
发表于 2018-05-21 16:40:01 回复(3)
我为啥看到这*p[4]就直接里解为行指针了呢,数组a看成是4行3列 ,不知道理解的对不对
发表于 2023-12-01 09:21:21 回复(0)
参考评论区回答

链接:https://www.nowcoder.com/questionTerminal/a746922d07e4431a90a739bfde895302
来源:牛客网

#include <stdio.h>
int main(void) {
    int a[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p[4], i;   
// int *p[4], p是一个存放int指针的数组,有四个
    for (i = 0; i < 4; i++) p[i] = &a[i * 3];
//p的每个指针指向a的一个数组单元,即a[0], a[3], a[6], a[9],值分别为1、4、7、10
    printf("%d\n", p[3][2]);
//p[3][2] = p[3]+2, p[3] 是 int* 类型, 偏移 2 个单位后指向 a[11]
    return 0;
}


不要看到两个括号就以为它是个二维数组,然后a数组只有一维,就觉得题目有问题
事实是,C语言里,所有下标的表示法(如p[3]),最后都会转换成这种 *(p+3)
理解了这一点,那么,二维形式的  p[i][j]  会被转换成 *(*(p + i) + j),即:p[3][2]会被转化成 *(*(p +3) + 2)

发表于 2023-02-24 15:39:54 回复(0)
*(*(p+3)+2)
发表于 2022-05-19 09:54:38 回复(0)
p[3][2] 其实= p[3]+2, p[3] 是 int* 类型, 偏移 2 个单位后指向 a[11] []和+地址一样
发表于 2021-10-26 12:59:16 回复(0)
答案应该是12
发表于 2018-05-14 20:03:04 回复(0)