首页 > 试题广场 >

有以下程序,若运行时输入:1 2 3,则输出结果是_____

[单选题]
有以下程序,若运行时输入:1 2 3<回车>,则输出结果是______。
int main()
{   
    int  a[3][2]={0},(*ptr)[2],i,j;
    for(i=0;i<2;i++)
    {
        ptr=a+i;
        scanf("%d",ptr);
    }
    
    for(i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
            printf("%2d",a[i][j]);
        printf("\n");
    }
}
  • 产生错误信息
  • 1 0
    2 0
    0 0
  • 1 2
    3 0
    0 0
  • 1 0
    2 0
    3 0
首先,第一个for循环只循环了2次,所以3没有读入。其次,第一次ptr=a+0表示指向数组a的第一行第一个元素,即a[0][0],所以 a[0][0]=1,ptr++,ptr指向下一行(注意,不是下一个),但是由于第二次循环时 ptr=a+1,ptr被覆盖了,所以,ptr++并没有用,所以ptr是指向数组a的第二行,所以 a[1][0]=2。
发表于 2018-08-03 00:52:37 回复(3)
要记住,数组名代表首元素的地址,在scanf时,直接写数组名,无需再行取地址,二维数组的数组名加一,指向下一个元素,而二维数组中的元素是一维数组,因此直接跳到下一行,进行赋值
发表于 2021-02-28 16:55:46 回复(4)
这叫盲选
发表于 2021-10-30 10:35:45 回复(4)

第一个for循环中,ptr分别取0,1。ptr取0,则读取数组中第一行;ptr取1,则读取第二行(而不是第一行第二列);因为ptr的定义是数组指针且长度为2.

发表于 2017-10-10 15:30:15 回复(1)
        ptr=a+i;// 这一步是将a[i][0]的地址付给ptr,注意是地址
        scanf("%d",ptr);// 这一步是将scanf获得的数值存到ptr所指向的内存
发表于 2022-02-16 15:06:50 回复(0)
这个真是要非常自信才能作对啊
发表于 2018-04-05 17:07:24 回复(0)
这里首先要明白什么是数组指针,数组指针就是指向一个一维数组的指针。
如:int arr[2]={0};int (*p)[2] = &arr;
由此,可知题中的ptr就是数组指针,题中第一个for循环依次将二维数组第一行的地址(两个元素的一维数组的地址)和第二行的地址(两个元素的一维数组的地址)赋值给ptr,而数组整个的地址和该数组的第一个元素的地址是一致的,也就是说scanf相当于把输入的值放入了每一行一维数组的首元素地址处(注意:只循环了两次),故二维数组a的a[0][0],a[1][0]的元素发生了改变。
发表于 2023-04-28 22:39:31 回复(0)
第一个for循环只进行了两次,故3没有写进去。
发表于 2017-10-10 21:37:03 回复(1)
ptr++只是指向该数组的下一个元素;ptr=a+i,换行;a32三行两列。
发表于 2017-09-08 17:00:38 回复(0)
知道结果,但是题目总是莫名的别扭 ,题目说了输入了123那就代表着3能输入喽,但是代码又很明显根本走不到第三次输入
发表于 2023-01-30 16:48:50 回复(0)
这里好像ptr即便不是指向数组也没关系?
发表于 2020-06-30 01:19:39 回复(1)
 ptr=a+i;// 这一步是将a[i][0]的地址付给ptr,注意是地址!!!
懂了
发表于 2024-03-20 14:24:06 回复(0)
这道题目也太细了吧,都想好了结果没想到最后一个坑是,循环俩次啊
发表于 2023-10-10 19:55:03 回复(0)
指针根本就没指向数组啊
发表于 2023-08-26 18:23:26 回复(0)


scanf输入的时候取**ptr    发生段错误
scanf输入的时候取*ptr        答案和题目一样  此时scanf输入的是元素地址(列地址)
scanf输入的时候取ptr     答案和题目一样     此时scanf输入的是行地址
为什么会发生这种情况呢,因为二维数组(数组指针) 的行地址,与第0行第0列的列地址在地址编号上一样。如下图


*ptr代表取 的是列地址
  ptr代表取的是行地址
什么是行地址,列地址。
a[3][2]    ptr = a;
  ptr   代表第0行的行地址   *ptr 代表第0 行第0列的列地址(等价于第0行第0列的地址 元素地址)  **ptr ===ptr[0][0]代表第0行0列的元素。
  a[0] 代表第零行的行地址  a[0][0] 代表第零行第零列的列地址

发表于 2023-08-01 21:43:38 回复(0)
发表于 2022-06-15 11:22:42 回复(0)
捏🐴,这也要设个坑
发表于 2022-05-16 13:52:30 回复(0)
指针不指向元素,只要指针值一致就可以了。。。害得我选了一个报错。最后亲测scanf("%d",*(ptr+i))得到的结果是一样的。。。有点容易误导人
发表于 2021-03-25 13:40:10 回复(0)
这个打印换行就很迷,我一看换行直接选a了
发表于 2020-11-27 21:08:36 回复(0)
多余的输入,scanf 就写不进去了
发表于 2020-04-13 17:23:25 回复(0)