3

我有一个关于初始化 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。

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

提前致谢,

斯里拉姆

4

5 回答 5

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 }创建一个 unnamed int[4],就像"Hello"创建一个 unnamed一样char[6]

所以从 C99 开始,char它的特殊之处在于提供了更方便的语法。

于 2013-01-12T16:19:56.253 回答
1

答案是:

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

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

于 2013-01-12T16:08:02.150 回答
1

这是因为字符串被大量使用,所以有一种更简单的方法来定义它们可用。这比每次都明确地制作一个字符数组要容易得多。

于 2013-01-12T16:09:46.713 回答
1

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

您依赖于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}是一个初始化器,根本不是文字。实际上,它是一个初始化列表,只能用于初始化事物。它不是字面意思。它不会创建一些包含值、、、和的静态数组,1然后给2你一个指针。它只是用来直接初始化一个数组。那你的意思是什么?该数组不存在任何它指向的地方。34int_ptr

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

于 2013-01-12T16:18:38.537 回答
0

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

于 2013-01-12T16:09:23.287 回答