#include <stdio.h> void foo(int b[][3]){ ++b; b[1][1] = 9; } int main(){ int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; foo(a); printf("%d", a[2][1]); }则程序的输出是()
/* 为什么这道题讨论的人这么少?转化为Java代码是如下吗? 也就是说数组类型的改变是会改变原数组的值的? */ public class e{ public static void foo(int[][] b){ for(int k=0;k<3;k++){ for(int i=0;i<3;i++){ b[k][i]++; } } b[1][1]=9; } public static void main(String args[]) { int[][] a ={{1,2,3},{4,5,6},{7,8,9}}; foo(a); System.out.println(a[2][1]); } }
分析:
1、C/C++传递的数组会退化成指针
2、对于数组指针的++,会根据数组中存储的内容,调整指针。
因为b是二维数组,b的类型是int(*)[3],即指向一个容量为3的一维int数组;所以++b相当于移动了数组的一整行。此时b指向了b[1][0]处,然后我们代码的b[1][1]=9可以看成指针的偏移。实际上可以化为*(*(b+1)+1)=9,因为b不是指向b【0】【0】处,而是指向b[1][0]处,所以通过*(*(b+1)+1)=9实际上修改的是b[2][1]处的内容。修改成了9. 所以最后打印a数组同样的位置时,打印的是9
#include<iostream> using namespace std; int main() { int a[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} }; //int* p = &a; //a++; cout << *(*a+1) << endl; //输出2 cout << **(a+1) << endl; //输出4 return 0; }
#include <stdio.h> 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\n",a[2][1]); }