为什么返回指针不能分配给指针,数组实际上不是指针?

时间:2014-12-29 08:03:06

标签: c pointers

#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;
}

我只想复制一个数组。但返回的指针值是错误的。我会不知所措,该做什么?

4 个答案:

答案 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;

但效果不会是你所期望的。

ab是函数的局部变量。虽然在函数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;
}
  1. 指针ab是局部变量。更改它们的值不会影响函数之外的任何内容。
  2. 您需要复制指针指向的内存而不是指针本身:memcpy (b, a, c * sizeof *b)