题目代码如下:
#include
#include
void fun(int *p1, int *p2, int *s) {
s = (int *)malloc(sizeof(int));
*s = *p1 + *(p2++);
}
int main() {
int a[2] = {1, 2}, b[2] = {10, 20}, *s = a;
fun(a, b, s);
printf("%d \n", *s);
}
这个结果为什么是1呢?题目解析没太看懂,我自认为算的是11,s = 1 + 10 = 11
没太理解等于1的这个原由,求解答,谢谢!
题目给的解析如下:
解析:
本题考查把数组名作为函数参数,执行fun函数后,s的值并没有发生变化,仍然是指向a,所以输出结果为1,选项C正确。
注意 ! 在这里 s 是创建这个函数的时候的 新的 s 而不是 旧的 s 所以 如果修改了 s 原先的s并不会发生变化
你可以复制下面的代码测试一下。
#include <stdio.h>
#include <stdlib.h>
int* fun(int *p1, int *p2, int *s) {
// 创建一个 空间 大小和 int 一致。
// 并把空间的地址 给 s ;
s = (int *)malloc(sizeof(int));
// s 空间的值 = p1 空间的值 + p2 空间的值 并且 p2[0] ++
*s = *p1 + *(p2++);
// 注意 ! 在这里 s 是创建这个函数的时候的 新的 s 而不是 旧的 s 所以 如果修改了 s 原先的s并不会发生变化
// 如果你需要改变原先的s就需要传入原先的地址 或者返回 新的 s 的地址
return s;
}
int main() {
int a[2] = {1, 2};
int b[2] = {10, 20};
// s = &a[0]
int *s = a;
// 传入了地址 &a[0] , &b[0] , s
s = fun(a, b, s);
printf("%d \n", *s);
}
很简单啊,fun函数是个毫无意义的函数。因为函数内是不能修改指针参数自身的地址的。所以实际上s根本没有变化,*s就是s[0],s[0]就是1啊