請解釋下面提到的程序的輸出。我認爲,輸出應爲1,但它不是1c程序的程序輸出
#include <stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1);
printf("%d ", *(ptr-1));
getchar();
return 0;
}
請解釋下面提到的程序的輸出。我認爲,輸出應爲1,但它不是1c程序的程序輸出
#include <stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1);
printf("%d ", *(ptr-1));
getchar();
return 0;
}
這是因爲&a
的類型是int(*)[6]
因此&a + 1 != &a[0] + 1
這是你的意思,鑑於你的預期輸出。
如果打印地址&a
和&a[0]
,他們將是相同的,但遞增&a
是不一樣的遞增&a[0]
因爲sizeof(int) != sizeof(int *)
,雖然這並不總是正確的,你的代碼不應該假設它,或者取決於。
此外,我們發現您正在使用的造型,因爲你的編譯器在抱怨一個事實,即&a
是不兼容的指針類型的,你不應該需要投如果指針是兼容的類型,以便
#include <stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = &a[0] + 1;
printf("%d\n", *(ptr-1));
return 0;
}
應該編譯才能找到,輸出將如您所期望的那樣爲1
。
downvoter似乎不同意,我想看看你的答案,看看我的是真的錯或不好。 –
我在同一件事情上有困惑..你可以請澄清一點 –
不知道爲什麼這被拒絕。希望看到downvoter評論他們的推理。 –
a
和&a
是相同的值,
a
是int [6]
類型的,
&a
是int (*)[6]
類型。
這意味着
ptr
== (int *)( &a + 1 )
== (int *)((char *) &a + 1*sizeof(*&a) )
== (int *)((char *) &a + 1*sizeof(a) )
== (int *)((char *) &a + 1*6*sizeof(int) )
== (int *)((char *) a + 1*6*sizeof(int) )
== (int *)((char *) a + 1*6*sizeof(*a) )
== (int *)( a + 6 )
== &a[6]
從而
*(ptr-1) == *(a+5) == a[5] == 6
之所以 「6」 被打印。
'輸出應該是1但它不是1' ...那它是什麼? –
您可能希望包含更多信息,包括您收到的實際輸出。 – Matt
'&a'的類型是'int(*)[6]'。它意味着指向'int [6]'的指針。所以'&a + 1'指向下一個('a [6]')最後一個元素('6':'a [5]')。然後投射到'int *'然後'-1',以指向最後一個元素'6'。 – BLUEPIXY