首页 > 解决方案 > 是否可以在 C 中将指针分配给数组或将数组的地址更改为指针地址?

问题描述

我需要将指针返回函数分配给数组,可以吗?

#include <stdio.h>
int * arrayReturn(int *q){ // example function
    return q;
}
int main()
{
    int z[3] = { 1 , 2 , 3};
    int q[3];
    q = *(int [3]) arrayReturn(z); 
    printf("%d %d %d", q[0],q[1], q[2]);

    return 0;
}

下面的代码接近我想要的,但这不再是一个数组。

int (*c)[3] = (int(*)[3])arrayReturn(z); 
printf("%d %d %d", c[0][0],c[0][1], c[0][2]);

标签: cpointers

解决方案


不,您不能像在此处那样重新分配数组:

int q[3];
q = *(int [3]) arrayReturn(z); 

如果要复制 to 的内容可以使用库函数:zqmemcpy

memcpy( q, z, sizeof z );

但该=运算符未定义为复制数组内容。

否则,你能做的最好的就是声明q为一个指针并让它指向第一个元素z

int *q = z; // equivalent to &z[0]

除非它是sizeof或一元运算符的操作数*,或者是用于在声明中初始化字符数组的字符串字面量,否则“N 元素数组T”类型的表达式将被转换或“衰减”为键入“pointer to T”,表达式的值将是数组第一个元素的地址——这就是上述赋值有效的原因。

C 中的数组是元素的简单序列——没有指示它们的大小或类型的元数据,也没有指向第一个元素的单独指针。如声明的那样,数组是

   +---+
z: | 1 | z[0]
   +---+
   | 2 | z[1]
   +---+
   | 3 | z[2]
   +---+
    ...
   +---+
q: | ? | q[0]
   +---+
   | ? | q[1]
   +---+
   | ? | q[2]
   +---+

没有单独的对象q可以分配.


推荐阅读