正如c书中所写,数组名是指向第一个元素的指针,因此在names数组中,名称指向第一个元素,它也是指向字符串文字的指针,然后* names将打印第一个元素,但是在下一个元素中代码行p指向a,q指向q,就像名字arr一样,但是因为你打印* qu得不到值为3,为什么?
#include <stdio.h>
int main(void){
char *names[]={"jack","philip"};
printf("%s\n",*names);
int a=3;
int *p=&a;
int *q=&p;
printf("%i\n",*q);
return 0;
}
答案 0 :(得分:1)
区别在于printf()
。 %s
需要一个指向空终止字符串的指针,而%i
期望传递数字本身,而不是指向数字的指针,这就是你所拥有的。
答案 1 :(得分:1)
a
是int
,因此p
是指向int
(int *
)的指针,因此q
是指针指向int
(int **
)的指针。要打印int
,请将int
提供给printf
:
printf("This is an int: %i\n", 42);
因此对于%i
,函数printf
需要int
类型的参数,但是您将*q
传递给它int *
类型。您将指针传递给printf
,它不指望数字指针,仅用于字符串。
答案 2 :(得分:0)
这就是工作代码应该是什么样子
#include <stdio.h>
int main(void) {
char *names[]={"jack","philip"};
printf("%s\n",*names);
int a=3;
int *p=&a;
int **q=&p;
printf("%i\n",**q);
return 0;
}
%s需要一个char *,正如你所说的那样是* name是什么,因为name是char **类型。但是%i期望一个int。由于p指向a,p是int指针,因为q指向p q是指向int指针的指针。 q就是p所指向的(a的地址)所以它不会打印出你想要的东西。同时将类型int 分配给int *的地址(当你执行int * q =&amp; p时你正在做的事情)会产生意想不到的结果
printf("%i", *q);
就像在做
printf("%c", *names);
这显然会给出奇怪的输出