常量指针的行为与打印时指向非常量的指针不同

时间:2016-10-25 06:47:06

标签: c++ c pointers char

我有以下代码:

int main(int argc, char **argv)
{
printf("%s\n",*argv);
int test = 5;
char* p;
*pint = test;
p = "banana";
printf("%s\n",p);
printf("%d\n",*pint);
}

为什么我必须写p="banana"而不是*p="banana"但是对于一个整数,它需要是*pint,否则它只会打印整数的地址?不应该p打印" banana"的地址?

3 个答案:

答案 0 :(得分:0)

  1. 您正在比较数组和整数变量行为!

  2. p = "banana";

  3. 您正在将字符串“banana”的基址分配给指针p。

    printf函数原型是

    int printf( const char *restrict format, ... );
    
    printf("%s\n",p);
    

    上述语句暗示您将指针p作为参数传递给函数printf,该函数保存字符串“banana”的地址

答案 1 :(得分:-1)

您正在使用%s进行打印。这将打印一个C字符串,将输入作为字符串第一个字节的地址。

如果使用%p进行打印,您将获得该地址。

printf("%p\n",p);

答案 2 :(得分:-1)

C风格的字符串是由'\0'终止的字符数组。 所以当你给它分配一个字符串时,它就是它的样子;

char p[] = {'b', 'a', 'n', 'a', 'n', 'a', '\0'};

因此,当您说使用格式说明符p打印出%s时,它将继续打印剩余的字符,直到它到达空终止字符。

执行此操作printf("%c", *p)只会打印第一个字符。

使用整数,如果你这样做;

int p[] = {1,2,3,4,5};

打印出来;

print("%d", *p);

你只得到数组中的第一个整数。

请注意;每个格式说明符都有它接受的值。这就是为什么他们被称为格式说明符

PS:

我根据user2079303和alk的评论编辑了我的答案!