我的程序如下:
#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
andz
是指针,而表达式y++
andz++
使用后缀运算符,因此这两个增量都将在赋值之后发生。
这条语句做了 3 件事:
y
的相同值所指向的z
值*y = *z
。y
指针。现在y
指向内存中的下一个 int
。z
指针。现在z
指向内存中的下一个 int
。y
如果和z
在语句之后使用,最后两个将是不好的:y
现在z
指向不属于代码的未初始化内存。
它相当于:
*y = *z;
y++;
z++;
我无法理解这个程序的输出
您正在打印指针,没有太多要理解的。
%p
而不是%d
*y++=*z++;
- 这只是将存储在指针中的值分配z
给*y
. 在此之后,它的y
和z
指针都递增。在此声明后取消引用两者z
并y
可能导致崩溃(未定义的行为)。
这种语句用于字符串复制实现
void my_strcpy(char *dest, char* src)
{
while((*dest++ = *src++));
}
变量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
在将预增量值分配给某个位置后增加指向的值?
这只是将 指向的对象的值分配给 指向的对象的值y
,z
然后递增两个指针。
它将简单地将 y 指向的对象的值分配给 z 指向的对象的值,最后它递增两个指针。
这与以下内容相同:
*y = *z;
++z;
++y;
*y++=*z++; //wat does this mean?
以上导致未定义的行为(在下一个序列点之前进行多次修改)。