#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[]="shevchenko ac milan";
printf("%s",&a);
}
这是印刷品“shevchenko ac milan”
but
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[]="shevchenko ac milan";
printf("%s",&a+1);
}
为什么会打印垃圾字符?
答案 0 :(得分:10)
&a
的类型为指向char[20]
的指针。
执行&a+1
后,您将转到内存中的下一个char[20]
项目,因此您将继续a
。
您应该改为char*
:通过将1加到它上面,您将转到下一个char
。
要获得char*
,您可以使用a
(通过执行此操作在char*
中衰减),从而a+1
转到下一个字符。
答案 1 :(得分:3)
您不需要传递(&a
)的地址 - 在C中,字符串是char
的数组,因此a
已经是一个地址。尝试:
char a[]="shevchenko ac milan"; printf("%s", a);
和
char a[]="shevchenko ac milan"; printf("%s", a+1);
答案 2 :(得分:1)
这种情况正在发生,因为当你说&amp; a + 1时。这会使指针到达字符串结尾之前的一个位置。这是指针基本操作。你可以检查这个整数数组也是。
例如
int a[]={1,2,3,4,5};
printf("%d",&a+1);
将始终打印垃圾值。
现在 将指向下一个1D数组 ,实际上并不存在。因此打印垃圾值。
答案 3 :(得分:0)
当您递增“指向地址的地址”时,您将获得未分配的值。 fbrereto是对的,你只需要将指针传递给第一个位置,并使用+ 1指向数组中的第二个位置。