需要帮助理解char和int指针。

3
在这段代码中,打印intchar指针变量的值时,我为什么要使用不同的访问方式?对于char指针,我写成了sampleclient,而对于int,我写成了*intid。为什么一个使用了*,而另一个没有用呢?
int main()
{
    char client[] = "ABCD";
    int intid = 10;

    samplepass(&client, &intid);

    return 0;   
}

void samplepass(char *sampleclient, int *intid)
{
    printf("%s %d\n", sampleclient, *intid);
}

你有什么问题? - krsteeve
2
一个重要的理解是,char 不是一个“字符”。它是一个数值,本质上是一个小的 int。只是有时候,在某些情况下,一系列的 char 位置被赋予代表可打印字符的值。但是在 char 本身中没有任何东西可以将其标识为字母“b”,而不是表示您的体温98。 - Hot Licks
3个回答

8

这是因为%s格式说明符需要一个字符指针,而%d需要一个整数参数。如果您想查看指针本身的值(即它们指向的地址),请使用%p


1
在C语言中,你不能像printf函数一样传递字符串(字符数组)给其他函数,所以你需要传递它在内存中的地址。然后该函数可以使用指针算术运算将内存地址视为数组。因此,printf函数读取字符串的方式是通过输入指向该字符串的指针。然后%s显示解引用的字符串(这里是ABCD),而不是指针地址(你可以使用%p代替%s来获取指针地址)。
整数问题更简单:在*intid中的*表示“获取存储在该地址上的值”。这就是为什么它打印出10而不是内存地址的原因。
获取内存地址的“正确”格式说明符是%p。但你也可以编写:
int main()
{
    char client[] = "ABCD";
    int intid = 10;

    samplepass(&client, &intid);

    return 0;   
}

void samplepass(char *sampleclient, int *intid)
{
    printf("%d %d\n", sampleclient, intid);
}

在我的电脑上,输出结果是:
-2140958000 -2140958004

(这些是clientintid在内存中的地址)。用%p替换%d可以得到格式良好的指针,并符合标准,因此我建议使用它。保留html标签。)

0

为了得到如下输出:

ABCD 10

请将您的代码行更改为:

samplepass(&client,&intid);
更改为 samplepass(client,&intid);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接