在此代码中打印int
和char
指针变量的值,为什么我以不同方式访问它们?对于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);
}
答案 0 :(得分:8)
这是因为%s
格式说明符需要char指针,而%d
需要整数参数。如果您想查看指针本身的值(即他们指向的地址),请使用%p
。
答案 1 :(得分: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
(这些是client
和intid
内存中的地址。用%p
代替%d
可以得到格式正确的指针,前面有一个0x
并且符合标准,所以我会使用它。
答案 2 :(得分:0)
对于看起来像的输出:
ABCD 10
更改行
来自samplepass(&client,&intid);
的
到samplepass(client,&intid);