首页 > 试题广场 >

有以下程序,程序运行后的输出结果是?

[单选题]

有以下程序

#include <stdio.h>
int main() {
    int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
    int(*p)[4] = a, i, j, k = 0;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 2; j++)
            k = k + *(*(p + i) + j);
    printf("%d", k);
    return 0;
}

程序运行后的输出结果是?

  • 40
  • 60
  • 80
  • 100
*(p+i) 相当于p[i],p[i]存储的是二维数组a的i行的数据地址。即 p[i]=&a[i][0];
*(p+i)+j 存储的是 a[i][j]的地址。*(*(p+i)+j)即是 a[i][j]的值。
发表于 2016-08-02 15:31:09 回复(0)
更多回答
推荐
本题答案应为 60

int (*p)[4]= a;说明 p是一个指针数组,长度为4,存储的是二维数组每行的地址。
p指向a的首地址 &a[0][0].
*(p+i) 相当于p[i],p[i]存储的是二维数组a的i行的数据地址。即p[i]=&a[i][0];
*(p+i)+j 存储的是a[i][j]的地址。*(*(p+i)+j)即是a[i][j]的值。
根据i j循环。i<3,j<2,即是取二维数组三行的前两列的值的总和。
1+3+9+11+17+19=60
编辑于 2015-04-20 10:39:42 回复(13)
1 3 5 7
9 11 13 15
17 19 21 23
矩阵如上;双层for循环是前两列;k=k+*(*(p+i)+j)=k+p[i][j]
发表于 2020-07-24 17:23:25 回复(2)
其实是前两列元素的和~~
发表于 2016-09-18 16:17:19 回复(1)
首先p是指向数组a第一行的指针,*(p+i)是数组第i行首元素的地址,既&a[i][0],*(p+i)+j=&a[i][j]
发表于 2022-07-08 16:06:23 回复(0)
int a[2][3] = {1,2,3,4,5,6}
int (*p)[3] = a;
a[1][2] 等价于 *(*(p++)+2)

指针所指向的变量类型必须和自生定义的指针类型相同
解析 p是一个指向int *[3] 类型的数组指针  存储的每一个数据类型都是int a[3]
 所以p++  的跨度是 3*sizeof int
 即p++ 表示的是指向第二个元素 即 a[1]
 然后(p++)取所指向的内容  即 *(p++)取得数组地址 a[1]的地址
 然后对*(p++)+2操作  相当于是对以为数组得操作  偏移为 2*sizeof int  即a[1][2]的地址 
然后取里面的内容 即*(*(p++)+2) 
此题的p+i 即偏移i个a[3]元素的长度
编辑于 2021-09-29 14:47:30 回复(0)
答案为60,主要是将每个小的一维数组中前两个相加
发表于 2015-07-31 11:36:51 回复(1)
int (*p)[4] = a,若不理解,可以假设如果是 int (*p) =a,这时候p+1就明显是指向a[0][0]的下一个a[0][1]了。所以好区分
发表于 2018-04-07 13:32:00 回复(1)
首先得明白指针数组和数组指针的区别:
       指针数组:实际上是数组,其元素都是指针,如int*p[3]。
       数组指针:指向数组的指针,该数组有3个int型数据,如int(*P)[3]。指向数组的指针,该数组有3个int型数据。
发表于 2017-06-29 17:29:51 回复(0)
大一看不懂是不是寄了
发表于 2023-12-18 20:43:33 回复(0)
k=k+*(*(p+i)+j)=k+p[i][j],p为首元素地址
发表于 2023-11-23 20:17:38 回复(0)
本题主要考查指针与数组。观察题目,可以发现,* p = &aa [ 0 ][ 0 ]语句实际是将数组aa的首地址赋给了指针变量p,将i的值带入for循环中,i=0时,aa [ 0 ][ 1 ] = 3, * p = 2 ; * p输出的是指针所指向的数组值,此时p所指向的是aa [ 0 ][ 0 ],输出2,而i = 1时执行了 + + p操作使指针向后移动指向了aa [ 0 ][ 1 ],所以在输出 * p时应为3.因此B选项正确。
编辑于 2015-04-20 10:39:42 回复(0)