链接: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;
}
结果:
解析:传入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;