我正在学习C
,我想使用函数打印名称,所以我编写了此代码:
#include <stdio.h>
void pn(char x);
void main()
{
pn("HHH");
}
void pn(char x)
{
printf("Hello %s\n",x);
}
并且输出为空,因此我更改了参数并将其作为指针,然后它起作用了:
void pn(char* x);
void main()
{
pn("HHH");
}
void pn(char* x)
{
printf("Hello %s\n",x);
}
输出为:Hello HHH
据我所知,指针是存储变量的地址,但是在这里我不发送任何地址?那么为什么只有当我将指针作为参数时它才起作用?
在第一个程序中,功能参数
void pn(char x);
具有类型char
,该函数希望函数将单个字符作为参数。
但是以字符串文字"HHH"
作为参数调用该函数
pn("HHH");
C中的字符串文字具有字符数组的类型。例如,字符串文字"HHH"
具有类型char[4]
,因为字符串文字还包括不可见的终止零字符。
例如在表达式中用作函数自变量数组,它们隐式转换为指向其第一个元素的指针。因此,字符串文字"HHH"
被转换为指向第一个字符char *
的类型为'H'
的临时对象。
结果,由于参数和相应参数的不兼容,该函数具有不确定的行为。
在第二个程序中,功能参数已正确更改为类型char *
,并且程序产生了预期的结果。
如果您只想在第一个程序中输出一个字符,则至少应按照以下方式进行更改
#include <stdio.h> void pn(char x); void main() { pn("HHH"[0]); } void pn(char x) { printf("Hello %c\n",x); }
或者像这样调用函数会更清楚
pn( 'H' );
传递字符文字。
C中的字符串定义为以空字符结尾的字符数组。 C语言中的数组由指向数组中第一个元素的指针定义。
"HHH"
是字符串文字。当您在C中使用字符串文字时,它会获得一个指向它的第一个元素的指针,键入指向char的指针。