需要帮助理解char和int指针

时间:2013-09-09 15:54:32

标签: c pointers

在此代码中打印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);
}

3 个答案:

答案 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

(这些是clientintid内存中的地址。用%p代替%d可以得到格式正确的指针,前面有一个0x并且符合标准,所以我会使用它。

答案 2 :(得分:0)

对于看起来像的输出:

ABCD 10

更改行

来自samplepass(&client,&intid);

samplepass(client,&intid);