首页 > 试题广场 >

下面是一段c程序:

[单选题]
下面是一段C语言程序:
#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]);
}
则程序的输出是()
  • 8
  • 9
  • 7
  • 以上均不对
推荐
B,c语言中变量是值传递,但是数组是首地址传递,就和指针是一样的
编辑于 2016-11-28 20:11:51 回复(5)
a作为数组地址传给b,b是int (*)[3]类型,b++后指向值4,此时吧b[1][1]即为a[2][1];b地址对应的值改变,因而a中对应位置的值也改变了;
发表于 2017-06-26 10:27:56 回复(0)
数组传递了首地址,b[0][0]指向数组a[0][0],但是执行++b后,b[0][0]指向a[1][0],因此b[1][1]就是a[2][1],b[1][1]=9即a[2][1]=9。
发表于 2017-01-16 16:53:13 回复(4)
/*
    为什么这道题讨论的人这么少?转化为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]);
	    }
	}


发表于 2016-11-30 11:17:39 回复(1)
1、C/C++传递的数组会退化成指针
2、对于数组指针的++,会根据数组中存储的内容,调整指针。
b是二维数组,b的类型是int(*)[3],即指向一个容量为3的一维int数组;++b后b[1][1]实际指向b[2][1]处。

发表于 2016-12-23 11:02:52 回复(5)

分析:

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


发表于 2019-05-08 12:15:45 回复(2)
(1)原先的a数组为:
(2)foo(a),a表示首地址,指向第1行第1项,并传递给b;
(3)++b,使得b指向第2行第1项;
(4)b[1][1] = 9,使得第3行第2项的“8”变成“9”:
(5)输出a[2][1],即输出第3行第2项的“9”。
编辑于 2022-08-26 18:07:05 回复(0)
一般的理解是局部变量在函数退出后会出栈自动回收;在这个例子中,传入数组退化为指针后,修改了指针的值和以及指针指向的值,函数退出后形参的b仍然会被自动回收,但是此时内存已经被修改了,即a的第三行第二列被改为9;我认为分析时最好不要把a和b建立对应联系,比如a[2][1]和b[1][1],这可能会产生误解或误导
发表于 2019-08-10 10:14:47 回复(0)
1、参数为一个二维数组且第二维有三个数
2、++b修改了数组的首地址,往前加一,因此此时的b[1][1]即是原来的b[2][1]
3、相当于引用传递,对指针的值修改,因此确实修改了
发表于 2017-03-18 23:32:03 回复(0)
b难道不是地址常量么?可以++b操作?
发表于 2019-07-27 10:30:02 回复(0)
选B
++b,表示地址+1,即原来表示b[0][0]的地址现在为b[1][0]的地址,++b的过程就是调整二维数组b的地址。调用函数foo(int b[][3] )后,b[1][1]就对应实参中的a[2][1]。故答案应该为B。
编辑于 2017-02-15 20:28:04 回复(0)
在函数体内,数组名退化为指针可以进行++操作

发表于 2021-03-17 13:03:52 回复(0)
这里的a[3][3]可以看成3个元素都是一维数组,数组地址传递给形参b时,也可以看成一维数组,所以++b,相当于指向第二个元素,即a[1]
b[1]表示在第二个元素的基础上b+1,所以指向第三个元素即a[2],所以b[1][1]=a[2][1]
发表于 2018-07-26 15:14:08 回复(0)
数组名传递后,在函数中会退化为指针。即int b[]等价于int *b;而int b[][3]等价于int (*b)[3]。
发表于 2018-02-27 20:24:35 回复(0)
A
发表于 2016-12-20 17:49:38 回复(0)
++b只是地址++了原本的0变成1,懂了嘛什么改变指向?是地址都往后递增了一行! 对地址++就会改变原本指向的地址 再提一句,函数内通过地址修改值是会变得,数组名就是地址
编辑于 2023-02-09 23:26:36 回复(0)
printf(“%d”,a[2][1]);//这个是中文引号,正确答案是编译不通过
发表于 2019-08-12 14:55:13 回复(0)
#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;
}

发表于 2017-11-11 22:33:53 回复(0)
C 数组a并没有因为Foo()函数发生改变。所以C
编辑于 2016-11-25 11:43:14 回复(4)
百度搜索二维数组的地址
发表于 2021-11-22 15:55:50 回复(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]);
}
发表于 2021-09-26 19:49:01 回复(0)