[英]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}
是初始化器,而不是文字。 实际上,它是一个初始化列表 ,只能用于初始化事物。 这不是文字。 它不创建一些静态数组与值1
, 2
, 3
,和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.