为什么我们需要传递指针作为参数来打印字符?

问题描述 投票:0回答:3

我正在学习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

据我所知,指针是存储变量的地址,但是在这里我不发送任何地址?那么为什么只有当我将指针作为参数时它才起作用?

c pointers implicit-conversion c-strings string-literals
3个回答
1
投票

在第一个程序中,功能参数

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' );

传递字符文字。


0
投票

C中的字符串定义为以空字符结尾的字符数组。 C语言中的数组由指向数组中第一个元素的指针定义。


0
投票

"HHH"是字符串文字。当您在C中使用字符串文字时,它会获得一个指向它的第一个元素的指针,键入指向char的指针。

© www.soinside.com 2019 - 2024. All rights reserved.