char str[] = "hello World!!!!!";
char *ptr = str + 6;
printf("%s",ptr);
输出:lo world !!!!!
在printf
语句中,它指定为ptr
而不是*ptr
因此,为了打印变量的值,我们使用*
(取消引用运算符)和指针名称。例如:
int i=2;
int *ptr;
ptr=&i;
printf("%d",ptr);
打印地址,因为ptr存储地址(&i
)类似于顶部示例,因为它应该打印地址而不是str[]
的值,因为只使用ptr
而不是*ptr
,但它没有。为什么呢?
答案 0 :(得分:2)
在你的第一个例子中,你必须为char
修饰符传递一个"%s"
指针,所以它实际上是它必须的方式,你当然知道如果您阅读了相应的文档,例如C标准。
第二个,是错的。因为它会调用未定义的行为。要打印变量的地址,需要使用运算符的&
地址创建指向它的指针,或者直接使用运算符的地址和"%p"
printf()
说明符,任何其他说明符会导致未定义的行为。
使用正确的说明符也适用于您的第一个示例。
答案 1 :(得分:0)
我们需要将地址传递给%s。地址必须是打印字符串的字符。它将打印,直到它击中' \ 0'字符串是字符串的结尾。
在第二个示例中,%d需要一个数字。我们可以将地址传递给它,或者地址中的值由我们决定。