有以下程序 main() { int a[3][2]={0},(*ptr)[2],i,i; for(i=0; i<2; i++) { ptr=a+i; scanf("%d",ptr); ptr+++; }

admin2009-01-15  11

问题 有以下程序    main()    {  int  a[3][2]={0},(*ptr)[2],i,i;       for(i=0;  i<2;  i++)    {  ptr=a+i;  scanf("%d",ptr);  ptr+++;  }       for(i=0;i<3;i++)    {  foil(j=0;j<2;j++)  printf("%2d",a[j]);       printf("\n");    }   若运行时输入:1  2  3<回车>,则输出结果为

选项 A、产生错误信息
B、1 0    2 0    0 0
C、1 2    3 0    0 0
D、1 0    2 0    3 0

答案8

解析 本题主要考查的是scanf()函数的输入原理。scanf()函数执行时,先从键盘缓冲区中读取用户输入的数据,若缓冲区为空或输入数据少于所需数据,则暂停程序等待用户的输入,直到用户敲入回车,scanf()将继续到键盘缓冲区中读取输入,如此反复直到满足scanf()函数所需数据,程序才继续执行下面的语句,而scanf()没有取完的数据仍然会保存在键盘缓冲区内,到程序结束时还没取完就会被释放掉,不会影响其他的程序运行。另外,scanf()函数将取到的数据匹配给第2个及其后面的指针参数所指的内存地址中去,而不检查该参数的类型是否匹配。所以在本题中考生不要被指针ptr的定义所迷惑,它所做的只不过是临时保存一下a+i的值,然后送到scanf()函数中去。题目首先定义了一个二维数组a[3][2]并用{0}初始化之,因为当所赋初值少于所定义数组的元素个数时,将自动给后面的元素朴以初值0,所以数组a[3][2]中所有的元素都被初始化为0了。在主程序的第一个for循环体中有三条语句,该循环体会被执行两次,每次执行时i的值分别为0和1。第1条语句让ptr的值分别为a+0 (即元素a[0])[0])的地址)和a+1(即元素a[1][0]的地址);第2条语句是一条输入语句,它每次接受一个十进制整数存入到ptr所指的内存地址中,题目要求输入的数据为“1  2  3<回车>”,所以两次scanf()函数的调用使a[0][0]和a[1][0]分别被赋为1和2。笫 3条语句让ptr自增1在这里没有起到任何作用,因为每次进入循环体ptr都会被重新赋值。最后,程序用一个两重循环按行列输出二维数组a中的所有元素。所以,选项B符合题意。
转载请注明原文地址:https://kaotiyun.com/show/BdHp777K
0

相关试题推荐
最新回复(0)