【问题标题】:Assign char array to another char array将 char 数组分配给另一个 char 数组
【发布时间】:2014-07-28 22:45:40
【问题描述】:

我知道我们不能将 char 数组分配给另一个 char 数组,例如:

 char array1[] = "Hello";
 char array2[] = "Hi!";

 array1 = array2;//does not compile

但是:

 char array1[] = "Hello";
 char *array2 = NULL;

 array2 = array1; //compile

 printf("%s", array2); //display Hello

这行得通。

谁能解释一下原因?

谢谢!

【问题讨论】:

    标签: c++ c arrays


    【解决方案1】:

    普通数组不可赋值。这就是为什么第一个代码示例不起作用的原因。

    在第二个示例中,array2 只是一个指针,而array1 尽管是一个数组,但在某些情况下可以衰减指向其第一个元素的指针。这就是这里发生的事情:

    array2 = array1;
    

    在这个赋值之后,指针array2 指向数组array1 的第一个元素。没有数组赋值,而是指针赋值。

    【讨论】:

    • 为了完整起见,您可能需要提及 const 和 strcpy。
    • 旁注:我总觉得如果将数组视为一等对象,C++ 会是一种更简洁的语言。也就是说,如果为数组定义了像 []= 这样的运算符(而不是要求数组到指针的转换)。它会很好而且统一。
    • 谢谢!现在我明白了。
    【解决方案2】:

    char array1[] 它基本上是一个指向 char 数组的第一个字母的指针。您可以将此地址分配给另一个指针变量。

    这是一个例子:

    
    #include <stdio.h>
    
    int main(){
    
        char a[] = "hello";
    
        char *b;
    
        a = b;
    
        printf("%s\n", a);
    
        return 0;
    }
    
    

    这段代码将输出:

    >>> hello 
    

    【讨论】:

      【解决方案3】:

      首先考虑以下代码会更清楚

      char *p = ( char * ) malloc( 6 * sizeof( char ) );
      

      实际上,您动态分配了一个由 6 个元素组成的未命名字符数组,并将数组第一个元素的地址分配给指针 p。现在您可以使用此指针访问数组的任何元素。例如

      p[0] = 'H';
      p[1] - 'e';
      p[3] = 'l';
      p[4] = 'l';
      p[5] = 'o';
      p[6] = '\0';
      
      printf( "%s\n", p );
      

      这同样适用于您的代码 sn-p,而不是未命名的数组和函数 malloc 返回的地址,您使用现有数组的名称,该数组的名称以相同的方式调整为指向数组第一个元素的指针

      char array1[] = "Hello";
      char *array2;
      
      array2 = array1; 
      
      printf( "%s\n", array2 ); 
      

      所以数组本身不会被复制。您只是引入了指向其第一个元素的指针。使用此指针,您可以访问数组的任何元素。因为它指向数组占用的内存区域。

      如果你想创建数组的副本,你应该写

      #include <string.h>
      
      //...
      
      char array1[] = "Hello";
      char array2[sizeof( array1 )];
      
      strcpy( array2, array1 ); 
      

      【讨论】:

      • sizeof(char)1
      • @Carl Norum 你想说什么?
      【解决方案4】:

      是这样的:

      对于编译器,两者都被视为指针,但区别在于:

      • char array1[] = {...} 是一个FIXED指针,指向内存的固定区域(在本例中,它位于堆栈中)

      • char *array2 = ...是一个变量指针,可以指向内存的任意一点(当然是有权限的),

      在第一种情况下,编译器甚至知道数组的大小,而在第二种情况下,编译器只知道它是一个指针,所以它不知道它指向的数组的大小。

      所以,对于printf(),两者都是指针...

      【讨论】:

      • 我不会说两者都被视为指针。只有当您开始访问数组元素时,您才开始处理指针。
      • 是的,有点……但它们之间有什么区别?第一种情况,编译器有更多信息......我没有看到任何其他区别......我没有实际的正式答案。这只是一个观点...
      • 当您想在 StackExchange(尤其是 C)上对 pointers 的讨论中做出贡献时,首先考虑一下 迂腐严谨特别挑剔痛苦回报 . (还有很多其他的)。然后决定是否参加战斗。当你根据一套迂腐的规则做出不精确特定陈述时,会有人出现并挑选 i> 分开。这有时痛苦,但如果你愿意学习,从长远来看应该有回报
      • 好的...你是对的...但是为什么不能将数组视为指针?我只是不记得它与指针不同的任何情况,除了赋值和sizeof() 操作......
      • @WagnerPatriota:我认为你在评论中回答了你自己的问题。
      猜你喜欢
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多