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

下面是一段c程序:
void foo(int b[][3])
{
   
++b;
   
b[1][1]=9;
}
void main()
{
  
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
  
foo(a); 
  
printf(“%d”,a[2][1]);
}
这段程序的输出是()

A.8, B.9 , C.7, D.以上均不对

答案选B;最后输出为9.

前提:二维数组本质上是以一维数组为元素的数组;在内存中是线性排列的; C语言中变量是值传递,但是数组是首地址传递,就和指针是一样的。

例:

#include<stdio.h>

int main()
{
    int arr[3][4] = {1,2,3,4,5,6,7,8,9};
    int i = 0;
    for(i=0; i<3;i++)
    {
        int j = 0;
        for(j=0; j<4;j++)
        {
            printf("&arr[%d][%d] = %p\n",i,i,&arr[i][j]);
        }
    }
    return 0;
}

结果:

alt

解析:传入foo函数的是二维数组a的首地址(只是将地址进行了传递); ++b(b=b+1):在传入的首地址上加1;此时b指向a[1]即b[0]==a[1];所以b[1]==a[2],所以b[1][1]==a[2][1];更改b[1][1]的的值就是更改a[2][1]的值;所以最后输出的值为9;