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。