我的程序下面给出该程序的输出:我无法理解
#include<stdio.h>
main()
{
int x=30,*y,*z;
y=&x;
z=y;
*y++=*z++; //what does this mean?
x++;
printf("%d %d",y,z);
return 0;
}
什么是这句话的含义:*y++=*z++
?
我的程序下面给出该程序的输出:我无法理解
#include<stdio.h>
main()
{
int x=30,*y,*z;
y=&x;
z=y;
*y++=*z++; //what does this mean?
x++;
printf("%d %d",y,z);
return 0;
}
什么是这句话的含义:*y++=*z++
?
它等同于:
*y = *z;
y++;
z++;
我无法理解这个计划
你打印指针的输出,没有太多的了解。
%p
代替%d
打印时,指针这是一样的:
*y = *z;
++z;
++y;
这只是分配对象poi的值y
与z
指向的对象相同,然后递增两个指针。
它将简单地将由y指向的对象的值分配给由z指向的对象的值,最后它增加两个指针。
y
和z
是指针,并表达y++
和z++
正在使用的后缀运算符,所以分配后两者的增量会发生。
本声明3两件事:*y = *z
:
y
相同的值由z
指出指向。y
指针。现在y
指向内存中的下一个int
。z
指针。现在z
指向内存中的下一个int
。如果y
和z
是会后声明中使用的最后两个将是坏:y
和z
现在指向不属于该代码未初始化的内存。
变量y
和z
是指向整数,并且在这种情况下,指向变量x的地址。
以下行将y
的值设置为地址x
(即,&x
给你`x)的地址。
y=&x;
z=y
下一行,*y++=*z++;
并不完全意义和可能会或可能不会编译取决于所使用的编译器。在GCC 4.3.2的情况下,会出现以下错误。
foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’)
它看起来像你试图做指针算术,但得到了运算符的优先权有点混淆。在将预增值分配给某个位置之后,您是否尝试增加z
指向的值?
由于错过了分号“z = y”的分号, – Ram 2012-08-15 13:21:39
*y++=*z++;
- 这只是将存储在指针z
中的值分配给*y
。在此之后,其递增y
和z
指针。在此陈述之后,解除引用z
和y
可能会导致崩溃(未定义的行为)。
这一种说法的字符串复制实现,则使用
void my_strcpy(char *dest, char* src)
{
while((*dest++ = *src++));
}
*y++=*z++; //wat does this mean?
未定义行为上述结果(多重修改的下一个序列点之前)。
'y'和'z'都指向'x',所以你给自己分配'x'。然后你增加两个指针。然后通过传递给'printf'来引起未定义的行为,但是使用'%d'转换,它需要'int's,而不是指针(打印指针,将它们转换为'void *'并用' p')。 – 2012-08-15 06:58:30
@JerryCoffin我在这件事上很生疏:即使它们超出分配的空间,它是否合法? – cnicutar 2012-08-15 06:59:21
@cnicutar:是的。只要不取消引用指针,就可以指向一个超过数组末尾的位置(C99,第6.5.6/7节):“对于这些运算符而言,指向非对象的指针一个数组的元素的行为与指向一个长度为1的数组的第一个元素的指针相同,该元素的类型为对象的类型。“ – 2012-08-15 07:03:11