C 取消对指针数组的引用
我很难理解这个简单的去引用语句 我试着打印C 取消对指针数组的引用,c,pointers,C,Pointers,我很难理解这个简单的去引用语句 我试着打印**名称,然后我从*名称--“C”中得到了我期望得到的东西。但是,*name给了我'D' #include <stdio.h> int main(void) { char *names[] = {"Carl", "David", "Gibson", "Long", "Paul"}; printf("%c\n", *names); return 0; } #包括 内部主(空) { 字符*名称[]={“卡尔”、“大卫”、
**名称
,然后我从*名称--“C”
中得到了我期望得到的东西。但是,*name
给了我'D'
#include <stdio.h>
int main(void)
{
char *names[] = {"Carl", "David", "Gibson", "Long", "Paul"};
printf("%c\n", *names);
return 0;
}
#包括
内部主(空)
{
字符*名称[]={“卡尔”、“大卫”、“吉布森”、“朗”、“保罗”};
printf(“%c\n”,*名称);
返回0;
}
控制台打印出
'D'
。我不确定为什么从*name
生成的字符不是第一项的第一个字母,'C'这是未定义的行为,并且输出随编译器而变化。
当我用gcc运行这个程序时,没有输出。使用**名称
打印“C”。
未定义的行为是因为错误的格式说明符。使用%c
,但*名称
指向数组中的第一个元素,即存储“Carl”的字符数组。
使用%s
格式说明符打印字符串
printf(“%c\n”,*名称);
编译此代码时,GCC将为您提供以下信息:
test.c:5:12: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
printf("%c\n", *names);
~^ ~~~~~~
%s
因此,您基本上是尝试打印名字的第一个字符,但不是将char
作为参数传递,而是传递指向char的指针。你能做的是:
printf("%c\n", *names[0]);
其中指定要从第一个元素中提取第一个字符
此外,使用**名称
与使用*名称[0]
相同,这会由于使用错误的格式说明符而导致未定义的行为--现代编译器会对此发出警告。正确代码的示例包括printf(“%s\n”、*名称)代码>或printf(“%c\n”、**名称)代码>打开/读取警告也是一个好主意%c
格式说明符需要一个字符(指向printf
的整数参数)。%s
格式说明符需要一个字符串(一个字符*
)。您正在将char*
传递给%c
说明符,这毫无意义。你的编译器应该对此提出警告(在这里发布之前,确保你的代码没有警告,除非你真的不理解警告,在这种情况下,这应该是你的文章的标题)。如果你确实想坚持使用你当前的方法,你可以尝试,例如:printf(“%c\n”)(*(names[1]+(sizeof(char)*2))
其中1
表示数组中的第二个名称,2
表示名称中的字母。这将从David
输出v
。或者,也可以使用%s
;)@AndyJ将sizeof
去掉,指针算法已经按元素大小进行缩放。它不会在你面前爆炸的唯一原因是sizeof(char)
保证为1。