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);
}
4

3 回答 3

8

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

于 2013-09-09T15:56:28.120 回答
1

在 C 中,您不能将字符串(字符数组)传递给类似 的函数printf,因此您可以做下一件最好的事情:将其在内存中的地址传递给它。然后,该函数可以使用指针算法将内存地址视为数组。所以printf读取字符串的方法是接收一个指向字符串的指针。然后%s显示取消引用的字符串(ABCD此处),而不是指针地址(您可以通过使用%p而不是获得%s)。

整数问题更直接:*in*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给出格式良好的指针,0x前面带有 a 并符合标准,所以我会使用它。

于 2013-09-09T16:01:02.353 回答
0

对于如下所示的输出:

ABCD 10

改变你的线路

samplepass(&client,&intid);
samplepass(client,&intid);

于 2013-09-09T16:06:56.850 回答