【问题标题】:Referencing a variable to an existing array将变量引用到现有数组
【发布时间】:2020-07-20 18:37:01
【问题描述】:

我对 C 语言还很陌生,并且开始使用指针。我还没有找到将数组分配给多个变量的方法。 理想情况下我想要的是:

char myArray[10] = "test";
char (*p)[10] = &myArray;
char anotherArray[10];
anotherArray = *p;

这不起作用,我不知道为什么。 我找到了一种使用 for 循环“复制”数组的方法,

for (int i = 0; i < 10; i++)
{
   anotherArray[i] = myArray[i];
}

我不知道这样做是否是一种好习惯以及是否有更简单的方法。

数组内容不应该改变,所以我只想有一个简单的方法来做到这一点:

firstArr[size] = "content";
secondArr = firstArr;

【问题讨论】:

  • 您希望每个变量引用同一个数组/内存,还是您想要同一个数组的多个副本?也就是说,如果数组内容通过一个变量发生更改,您是否希望所有变量都看到相同的更改?
  • 什么是input?为什么(*p) 周围有奇怪的括号?
  • @MM1 使用标准 C 函数 strcpy 将字符串从一个字符数组复制到另一个。
  • 抱歉,刚刚编辑了
  • 还是不太清楚。但您似乎想要这个:char firstArr[size] = "content"; char *secondArr = firstArr;?

标签: c arrays pointers variable-assignment


【解决方案1】:

您不能在 C 中分配数组,无论是通过本身还是通过取消引用指向数组的指针,语法都不允许这样做。

数组通常用memcpy 复制。如果它们是字符串,您还可以使用strcpy,它会向上复制直到找到字符串空终止符。

在您的示例中,这将是 strcpy(anotherArray, *p);。但是使用char (*)[10] 类型的数组指针有点奇怪,使用指向数组第一个元素的指针更为常见。我建议您将代码更改为:

#include <stdio.h>
#include <string.h>

int main(void) 
{
  char input[10] = "test";
  char* p = input;
  char anotherArray[10];

  strcpy(anotherArray, p);
  puts(anotherArray);
}

【讨论】:

  • 由于数组的大小总是一样的,我还是用 memcpy
  • 我添加了上下文短语,因为 OP 在第一个示例中明确尝试通过取消引用指向数组的指针来完成此操作,因为旁边的答案很好。 +1 如果您不喜欢它,请随意回滚编辑。
  • @RobertSsupportsMonicaCellio 没关系。
【解决方案2】:

您不能将一个数组分配给多个变量,但您可以将多个变量分配给一个数组。

指针都是关于内存和它们指向的内存。

诸如此类的语句将固定数量的内存(10 char 大小的内存字节)分配给变量 myArray,并将内容初始化为包含“test1”。

char myArray[10] = "test1";

根据定义,myArray 实际上是指向第一个内存位置的指针,在这种情况下,它包含一个值 't' 的字符,但它固定在该内存中。

您可以定义另一个指向 char 类型的指针,并为其分配与指向保存数据 "test1" 的内存的指针相同的值 - 因此:

char *secondPtr = myArray;

现在secondPtrmyArray 都指向同一个内存,其中包含"test1"。数据没有两个副本,但如果你这样做了,它可能会出现

printf("myArray %s", myArray);
printf("secondPtr %s", secondPtr);

现在您可以使用myArraysecondPtr 来更改相同的数据,这就是为什么要小心处理指针的原因。

现在 secondPtr 只是一个指向 char 的指针,因此它不像 myArray 那样固定,所以你可以这样做:

char myArray2[10] = "test2";
secondPtr = myArray;
printf("secondPtr %s", secondPtr);

secondPtr = myArray2;
printf("secondPtr %s", secondPtr);

要将数据从一个数组复制到另一个数组,您可以使用 memcpy,它将指定数量的内存字节(八位字节)从一个位置复制到另一个位置。

循环执行相同的过程(这是基本代码,但实际上并不是执行它的最佳方式,因为没有检查数组的大小或循环迭代的次数)例如

for(int i=0; i<10; i++)
{
  myArray2[i] = myArray[i];
}

这也可以是:

secondPtr = myArray2;
for(int i=0; i<10; i++)
{
  myArray2[i] = secondPtr +i;
}

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多