将char指针初始化为字符串,将其他类型指针初始化为数组

时间:2013-01-12 16:06:32

标签: c++ c

我有一个关于初始化char指针和其他数据类型指针的问题。具体来说,我们可以按如下方式初始化char指针:

char *char_ptr = "Hello World";

据我所知,字符串唯一特别之处在于它是一个'0'终止字符数组。但是,我们不允许执行以下操作:

int *int_ptr = {1,2,3,4};

但我们必须这样做:

int int_arr[] = {1,2,3,4};
int_ptr = int_arr;

为了让int_ptr指向int_array的第一个元素。

在char情况下,我们没有在让char_ptr指向字符串之前将字符串“Hello World”显式定义为char数组,而是使用字符串“Hello World”直接初始化char_ptr。

我的问题是,为什么会出现这种情况,有什么特别的字符串可以让我们这样做,但不能用其他类型呢?

提前致谢,

斯利拉姆

5 个答案:

答案 0 :(得分:3)

对于使用复合文字的其他类型,您可以在C99或更高版本中执行相同的操作:

#include <stdio.h>

int main(void) {
    int *ptr = (int[]){ 1, 2, 3, 4 };
    for(int i = 0; i < 4; ++i) {
        printf("%d: %d\n",i, ptr[i]);
    }
    return 0;
}

复合文字(int[]){ 1, 2, 3, 4 }创建一个未命名的int[4],就像"Hello"创建一个未命名的char[6]

从C99开始,char仅提供更方便的语法。

答案 1 :(得分:1)

答案是:

字符串(文字)被视为特殊字符。

相信它!接受它,并与它一起生活。

答案 2 :(得分:1)

这是因为字符串的使用非常多,以至于可以更容易地定义它们。这比每次明确地创建一个字符数组更容易。

答案 3 :(得分:1)

"Hello World"是一个字符串文字。它具有类型“12 const char的数组”和静态存储持续时间。也就是说,它会在内存中为您提供一个持续一段时间的数组。它有12个char,因为你正确指出了空字符。现在让我们考虑两种情况。

使用const char *char_ptr = "Hello World";,您依赖的事实是数组可以转换为指向其第一个元素的指针。因此,您的char_ptr指向文字所代表的静态数据的第一个元素。

使用const char char_arr[] = "Hello World";,会发生什么是初始化字符数组的特殊规则。你得到的是char_arr,其类型为“12 const char的数组”,但静态字符串数据中的字符用于初始化数组中的每个元素(第8.5.2节)。这意味着,您的数组char_arr是静态字符串数据的副本。

当我们int *int_ptr = {1,2,3,4};时,我们会收到错误消息。为什么?因为{1, 2, 3, 4}不像上面的字符串文字。 {1, 2, 3, 4}是初始值,而不是文字。实际上,它是初始化列表,只能用于初始化事物。这不是文字。它不会创建一些静态数组,其中包含值1234,然后为您指定一个指针。它只是用于直接初始化数组。那么你的int_ptr会指向什么?数组在任何地方都不存在,指向它。

但是,int int_arr[] = {1,2,3,4};正确使用此初始化列表。你得到一个数组int_arr,其中每个元素都被初始化为初始化列表中的元素。

答案 4 :(得分:0)

设置char * char_ptr =“Hello World”时,将字符串文字的地址设置为char_ptr。但是,在其他数据类型的情况下,没有什么类似于字符串文字。所以,这是不允许的。