我的程序下面給出該程序的輸出:我無法理解
#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