c语言。用指针做实参、形参为什么会出现在被调函数中数组成功修改但主调函数中的数组却不一样的情况?

是不是我哪里出错了?求大神指点!源码如下:
#include<stdio.h>

#define A 5

void copy_arr(double [],double [],int);
void copy_ptr(double *,double *,int);
void copy_ptrs(double [],double [],double *);

int main(void)
{
double source[A]={1.1, 2.2, 3.3, 4.4, 5.5}; double target1[A];
double target2[A];
double target3[A];
int i;

copy_arr(target1,source,A); copy_ptr(target2,source,A); copy_ptrs(target3,source,source+A); printf("target2[0]=%-8.2f\n",target2[0]);//test for(i=0;i<A;i++)
printf("source[%d]=%-6.2f"
"target1[%d]=%-6.2f"
"target2[%d]=%-6.2f"
"target3[%d]=%-6.2f\n",i,source[i],i,target1[i],i,target2[i],i,target3[i]);

return 0;
}

void copy_arr(double target1[],double source[],int a)
{
int i;

for(i=0;i<a;i++)
target1[i]=source[i];

}

void copy_ptr(double * target2,double * source,int a)
{
int i;

*(target2+0)=*(source+0);
for(i=0;i<a;i++)
{
*(target2+i)=*(source+i); printf("%-8.2f%-5.2f\n",*(target2+i),*(source+i));//test
}

printf("target2[0]=%-8.2f source[0]=%-8.2f\n",*(source+0),*(target2+0)); //test

printf("&target2[0]=%p &source[0]=%p\n",&target2[0],&source[0]);
//test
}

void copy_ptrs(double taeget3[],double source[],double * rce)
{
int i=0;

double * sou=source;
while(rce-(sou+i)>=0)
{
taeget3[i]=source[i];
i++;
}
}

copy_ptrs传参错了。
看你这个函数是用尾元素地址的当前元素地址差值作为循环条件的。所以你这里形参变量rce表示的是最后一个元素的地址。
所以实参应该是source+A-1。你写的是source+A造成循环数组越界了。
另外,你main最后的打印用i做下标,但没给i赋值。要加一个for。
下图加粗的就是改动的地方。

温馨提示:内容为网友见解,仅供参考
无其他回答

c语言。用指针做实参、形参为什么会出现在被调函数中数组成功修改但主调...
copy_ptrs传参错了。看你这个函数是用尾元素地址的当前元素地址差值作为循环条件的。所以你这里形参变量rce表示的是最后一个元素的地址。所以实参应该是source+A-1。你写的是source+A造成循环数组越界了。另外,你main最后的打印用i做下标,但没给i赋值。要加一个for。下图加粗的就是改动的地方。

...定义而且不用返回值就能改变主函数中的数据 而
这个很容易理解,指针变量保存的是地址信息,*p这个是取p指针保存的地址里面的值,更改的也是保持的地址里面的值。而函数中传递的是变量的拷贝,比如指针传递的就是他保存的地址 如果在函数中对他保存的地址改掉,那么是不影响主函数中的变量的 错误的原因是scanf中是用英文的逗号,而你输入的是中文的逗...

c语言中指针作为实参使用SWAP函数的问题。
c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中...

c语言函数的形参与实参的问题?
首先要理解一点,数组在做参数传递的过程中会损失数组的长度信息,退化成一个指针 例如你形参写成(char s[10]),或者干脆(char s[]),函数只能接收到一个char 所以:char dp[n][m]的类型本质上是数组的指针,即char (*)[m],它是指向长度为m的char数组的指针 char **是char *的指针,指针是...

C语言,形参和实参到底是怎么一回事
形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。函数的形参和实参具有以下特点:1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调...

帮我解释下C语言中 实参 形参 主调函数 被调函数的关系 通俗点
函数定义中的参数是形参,而实际调用该函数时输入的参数时实参 如一个函数func原型为:void func(int XINGCAN){ ...} 调用该函数时:int SHICAN;func(SHICAN);主调函数和被调函数应该很好理解,如上面的例子中func就是被调函数,而调用func的函数就叫做主调函数了 void的意思就是无、空的意思,...

...下c中的形参和实参的问题,为什么有的程序调用函数后主函数的值变了...
这下在子函数中,对a的操作直接是对其存放位置的操作,所以会改变主函数中的值 总结:简单的说,传值调用,就是在Copy出来一个数值一样的参数,你在子函数中修改的只是真正实参的副本;传址调用中,都是指向同一个内存单元,修改会改变其值。不知道这么说你明白没有。

C语言调用函数时什么情况下通过形参实参会发生改变?
形参和实参如果都是地址(即指针)时,会发生改变形参即可改变实参的情况,因为这时形参和实参实际上是对应同一段内存的数据。

在C程里,为啥用指针做形参的函数可以改变实参数组的值?
c语言就这样规定的,可以访问到那个地址,改变了地址里元素的值,所以实参数组的值也改变了

c语言中数组名为函数实参的问题?
代码在编译时会出现 error C2664: 'InsertSort' : cannot convert parameter 1 from 'int' to 'int []'这是因为用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素地址,因此对参数的类型做一下改变,如下图所示:

相似回答