#include<stdio.h>
double *array_transmission(double *a,double *b,int c);
int main(void)
{ int number=8;
int i;
double easy_array[]={1,2,3,4,5,56,7,8};
double copy1[8];
copy1=array_transmission(easy_array,copy1,number);
for(i=0;i<number;i++)
printf("%d\t",copy1[i]);
return 0;
}
double *array_transmission(double *a,double *b,int c)
{
int i;
b=a;
return b;
}
我只想复制一个数组。但返回的指针值是错误的。我会不知所措,该做什么?
答案 0 :(得分:4)
在您的代码中,
copy1=array_transmission(easy_array,copy1,number);
您想要做的是从函数array_transmission()
获取返回值,并将值放入copy1
,代表基地址 of a array。
double copy1[8];
是一个自动堆栈分配的数组。您不应该更改该阵列的基地址。
是的,数组和指针是不同的。你以这种方式对待它们会更好。
编辑:
另外,正如haccks所提到的,在你的array_transmission()
函数中,你返回的是一个自动本地[到该函数]指针变量。您可能无法从函数返回指向自动局部变量的指针。 auto local 变量的范围仅限于该函数。一旦函数完成执行,堆栈上就不存在该变量,因此,调用函数中返回指针的使用也是无效的。
答案 1 :(得分:3)
如果要将一个数组复制到另一个数组中,则必须逐个元素地复制它们。该功能可能看起来像
double * array_transmission( cosnt double *src, double *dst, size_t n )
{
while ( n-- ) *dst++ = *src++;
return dst;
}
至于你的功能实现
double *array_transmission(double *a,double *b,int c)
{
int i;
b=a;
return b;
}
那么你确实可以写
b=a;
但效果不会是你所期望的。
a
和b
是函数的局部变量。虽然在函数b内部设置为a的值,但这不会对数组进行处理。简单地说现在a和b指向同一个对象,它是a指向的数组的第一个元素。退出函数后,局部变量a和b将被销毁,但数组的元素不会被复制。
在你处理指针的函数中。 a和b是指向相应数组的第一个元素的指针。您可以将一个指针指定给另一个。但是数组不是指针。他们没有复制赋值运算符。例如,您可能不会按以下方式编写
double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };
b = a;
编译器将发出错误。
将此代码段与以下内容进行比较
double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };
double *pa = a;
double *pb = b;
pb = pa;
在这种情况下,您将指针pa指定给指针pb(与您在函数中的操作方式相同)。但阵列本身并未被复制。现在,两个指针指向数组a的第一个元素。
还要考虑到你可能不会写
double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };
b = array_transmission( a, b, 3 );
因为数组不是指针而且没有复制赋值运算符(它是C ++术语)。事实上,没有必要使用赋值,因为在函数内部元素已经从一个数组复制到另一个数组(前提是你按照我的方式编写了函数)。
你可以写简单
double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };
size_t i;
array_transmission( a, b, 3 );
for ( i = 0; i < 3; i++ ) printf( " %f", b[i] );
printf( "\n" );
当你可以问为什么这个案例中的函数有返回类型double *
?它非常有用。例如,考虑一种情况,当您需要将两个数组复制到另一个数组中的第三个数组时。然后你可以写例如
double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };
double c[6];
size_t i;
array_transmission( b, array_transmission( a, c, 3 ), 3 );
for ( i = 0; i < 6; i++ ) printf( " %f", c[i] );
printf( "\n" );
答案 2 :(得分:0)
当您调用函数double *array_transmission(double *a,double *b,int c)
时,参数b是您在通话copy1=array_transmission(easy_array,copy1,number);
上传递的本地副本
当您退出该函数时,此副本将被删除,因此您将返回指向任何内容的指针。
如果您希望copy1
指向easy_array
(而不是指向easy_array的副本)并且可以简单地执行
double* copy1;
copy1 = easy_array;
如果你想要一份easy_array的新副本,你需要这样做:
for (i=0;i<8;i++) {
copy1[i] = easy_array[i];
}
答案 3 :(得分:0)
double *array_transmission(double *a,double *b,int c)
{
int i;
b=a;
return b;
}
a
和b
是局部变量。更改它们的值不会影响函数之外的任何内容。memcpy (b, a, c * sizeof *b)
。