Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么返回指针不能分配给指针,数组实际上不是指针?_C_Pointers - Fatal编程技术网

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

C 为什么返回指针不能分配给指针,数组实际上不是指针?,c,pointers,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_tra

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

在你的代码中

#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;
}
您要做的是从函数array_传输中获取返回值,并将该值放入copy1,它表示数组的基址

双拷贝1[8];是一个自动堆栈分配数组。您不应该更改该数组的基址

是的,数组和指针是不同的。你最好那样对待他们

编辑:


此外,正如haccks所提到的,在数组_传输函数中,返回的是一个自动本地[到该函数]指针变量。您不能从函数返回指向自动局部变量的指针。自动局部变量的范围仅限于该函数。一旦函数完成执行,堆栈上就不存在该变量,因此,调用方函数中返回指针的使用也是无效的。

调用函数double*array\u transmissiondouble*a,double*b,int c参数b是调用copy1=array\u transmissioneasy\u array,copy1,number时传递的内容的本地副本; 退出函数时,此副本将被删除,因此您将返回一个指向nothing的指针

如果需要,copy1将指向easy_数组,而不是easy_数组的副本,只需执行以下操作即可

copy1=array_transmission(easy_array,copy1,number);
如果需要easy_array的新副本,则需要执行以下操作:

double* copy1; 
copy1 = easy_array;

如果要将一个数组复制到另一个数组中,则必须逐元素复制它们。函数可能看起来像

for (i=0;i<8;i++) {
   copy1[i] = easy_array[i];
}
至于你的功能实现

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;
}
但效果并不是你所期望的

a和b是函数的局部变量。虽然在函数中,b被设置为a的值,但这并不影响数组的大小。现在,a和b指向a指向的数组的第一个元素所在的同一个对象。退出函数后,局部变量a和b将被销毁,但数组的元素未被复制

在函数中处理指针。a和b是指向相应数组的第一个元素的指针。您可以将一个指针指定给另一个指针。但是数组不是指针。他们没有复制分配操作符。例如,您可以不按以下方式编写

    b=a;
编译器将发出一个错误

将此代码段与以下代码段进行比较

double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };

b = a; 
在本例中,将指针pa分配给指针pb的方式与在函数中的分配方式相同。但数组本身并没有被复制。现在两个指针都指向数组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;

因为再次数组不是指针,没有复制赋值操作符,它是C++术语。事实上,不需要使用赋值,因为在函数内部,元素已经从一个数组复制到另一个数组中,前提是您编写了如我所示的函数

你可以写得很简单

double a[] = { 1.1, 2.2, 3.3 };
double b[] = { 4.4, 5.5, 6.6 };

b = array_transmission( a, b, 3 );
指针a和b是局部变量。更改其值不会影响函数之外的任何内容。 您需要复制指针指向的内存,而不是指针本身:memcpy b,a,c*sizeof*b。
您只是在复制指针,而不是数组。答案的可能重复可以进一步改进,添加指向自动局部变量的指针无法返回……可能是我在问题中表达得不够清楚,如果这是原因,我非常抱歉。我的问题是打印在主函数中,而不是打印在一个简单的子例程中。@qiabigin我在我的帖子中写道,您不能将函数的返回值指定为指向数组名的指针。在这种情况下,您必须在main中定义一个指针,并将函数的返回值分配给该指针。例如,双p=array_transform/…*/;我想知道评论中似乎没有显示星号。我把p定义为一个指针。来自莫斯科非常感谢你的帮助,通过你我解决了我的问题。
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 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" );
double *array_transmission(double *a,double *b,int c)
{
    int i;
    b=a;
    return b;
}