在本声明中
char* s = "HI!";
创建了两个实体.
第一个是字符串文本"HI!"
,它具有静态存储持续时间和数组类型char[4]
.(在C++中,与C相反,它具有常量字符数组const char[4]
的类型.)
您可以通过这个print tf调用来进行判断
printf( "sizeof( \"HI!\" ) = %zu\n", sizeof( "HI!" ) );
该字符数组用作指针s
的初始化器.在这种情况下,它被隐式地转换为指向其第一个元素的指针,并且第一个元素的地址被分配给指针s
.
至于这段代码片段
char* name = "BEN";
printf("%c %c\n", *(name + 1), *name + 1);
则由于指针算法,类型为char *
的表达式name + 1
指向字符串文字"BEN"
的第二个字符(即指向'E'
).取消引用类似于*(name + 1)
的指针表达式,您将获得该表达式所指向的字符串的符号.实际上,表达式*(name + 1)
与name[1]
相同,即与1[name]
相同.:)
对于这个表达式*name
,然后解除对指针name
的引用,得到字符串文字的第一个符号'B'
.并且将1( *name + 1 )
添加到该符号的内部代码.结果,该表达式产生'B'
之后的下一个符号,即'C'
.公式( *name + 1 )
等同于公式name[0] + 1
.
使用像name[1]
和name[0] + 1
这样的下标运算符可以使表达式更清晰.
我想您会很感兴趣的是,printf
的调用可能只使用原始的字符串字面值以如下方式重写
printf("%c %c\n", *( "BEN" + 1), *"BEN" + 1);
或通过以下方式
printf("%c %c\n", "BEN"[1], "BEN"[0] + 1);
或者甚至是以下方式
printf("%c %c\n", 1["BEN"], 0["BEN"] + 1);