代码之家  ›  专栏  ›  技术社区  ›  user8185371

为什么我不能使用与“const char*”相同的“const int*”生成int数组?

  •  5
  • user8185371  · 技术社区  · 7 年前

    #include <iostream>
    int main() {
      const char *string = "Hello, World!";
      std::cout << string[1] << std::endl;
    }
    

    ? 它正确地输出了第二个元素,而如果没有数组的下标符号,我就无法生成整数类型的数组 [ ] const int* intArray={3,54,12,53}; .

    4 回复  |  直到 7 年前
        1
  •  6
  •   Passer By    7 年前

    “为什么”是:“因为字符串文字是特殊的”。字符串文字作为程序本身的常量部分存储在二进制文件中,并且 const char *string = "Hello, World!"; string .

    对于其他类型,没有等效的特殊行为,但您可以通过生成命名静态常量并使用该常量初始化指针来获得相同的基本解,例如。

    int main() {
      static const int intstatic[] = {3,54,12,53};
      const int *intptr = intstatic;
      std::cout << intptr[1] << std::endl;
    }
    

    的影响 static const

    int main() {
      static const char hellostatic[] = "Hello, World!";
      const char *string = hellostatic;
      std::cout << string[1] << std::endl;
    }
    

        2
  •  1
  •   zneak    7 年前

    几乎

    {1,2,3} "abc" 不是一回事。事实上,如果你想做一个比较, {'a', 'b', 'c', '\0'} 。它们都是有效的数组初始值设定项:

    char foo[] = "abc";
    char bar[] = {'a', 'b', 'c', '\0'};
    

    然而,只有

    在C中(以及作为某些C++编译器的扩展,包括Clang和GCC),可以将复合文字强制转换为数组类型,如下所示:

    static const int* array = (const int[]){1, 2, 3};
    

    然而,这几乎是不正确的。它在全局范围内工作,并作为函数参数,但如果您尝试用它初始化自动存储的变量(即函数中的变量),您将得到一个指向即将过期位置的指针,因此您将无法将其用于任何有用的用途。

        3
  •  1
  •   Vlad from Moscow    7 年前

    这种特性存在于C中,并被命名为 复合文字 .

    #include <stdio.h>
    
    int main(void) 
    {
        const int *intArray = ( int[] ){ 3, 54, 12, 53 };
    
        printf( "%d\n", intArray[1] );
    
        return 0;
    }
    

    但是,C++不支持C中的此功能。

    与字符串文字相比有一个区别。字符串文字的静态存储持续时间与它们出现的位置无关,而复合文字的静态保存持续时间或自动保存持续时间取决于它们出现的地方。

    在C++中,与此功能接近的是 std::initializer_list

    #include <iostream>
    #include <initializer_list>
    
    int main() 
    {
        const auto &myArray = { 3, 54, 12, 53 };
    
        std::cout << myArray.begin()[1] << std::endl;
    
        return 0;
    }
    
        4
  •  0
  •   Ludonope    7 年前

    因此:

    const char str[6] = "hello";
    

    与以下内容完全相同:

    const char str[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };