繁体   English   中英

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

[英]initializing char pointer as string vs other type pointers as arrays

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

我的问题是,为什么会这样,有什么特别的字符串允许我们这样做,但不能与其他类型这样做?

提前致谢,

斯利拉姆

对于使用复合文字的其他类型,您可以在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只提供更方便的语法。

答案是:

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

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

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

"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}是初始化器,而不是文字。 实际上,它是一个初始化列表 ,只能用于初始化事物。 这不是文字。 它不创建一些静态数组与值123 ,和4中,然后给你的指针。 它只是用于直接初始化数组。 那么你的int_ptr指向什么? 该数组不存在于任何指向它的位置。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM