【问题标题】:Is it possible in C to assign pointer to an array or change to address of array to the pointer address? [duplicate]是否可以在 C 中将指针分配给数组或将数组的地址更改为指针地址? [复制]
【发布时间】:2021-09-28 14:06:50
【问题描述】:

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

#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]);

【问题讨论】:

  • 不,数组不是指针
  • 没有。您不能更改现有对象的地址。
  • 只需将q 声明为int *
  • 在将q 设为数组时,您希望获得什么优势?您是否尝试将数据从z 复制到新空间q?还是您只是想要另一种方式来指向z 中的数据?
  • 您可能认为您需要一个数组才能使用q[0],但事实并非如此。当我们知道指针指向数组时,使用方括号对我们来说是一种“语法糖”。 q[2]*(q + 2) 的表达式相同。具有数组名称的表达式衰减为指向该数组第一个元素的指针。

标签: c pointers


【解决方案1】:

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

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

如果你想将z内容复制到q,你可以使用memcpy库函数来做到这一点:

memcpy( q, z, sizeof z );

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

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

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

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

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

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

没有单独的对象q 可分配

【讨论】:

    【解决方案2】:

    指针是一个包含内存地址的变量。 数组只是内存中占用这么多字节的地方。 因此,它们是非常不同的对象,不能相互分配。

    但是,指针可用于指向数组,因此可用于将数据从一个数组复制到另一个数组,例如,使用memcpy

    int c[3];
    memcpy(c, arrayReturn(z), sizeof(c));
    

    当然,没有检查数组大小,并且假设 arrayReturn() 的返回指向的数组大小足够大,可以复制到 c。也没有办法知道它指向的数组的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多