正在關注yesterday's question,我試了一些更多的指針。具體類型爲int(*)[N]爲什麼我不能在這個指針上打印這個值?
這裏的指針是一些代碼,我寫道:
#include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int (*p) [5] = &a;
int *q = a;
printf("\t\t\t\t\tp\t\tq\n\n");
printf("Original Pointers: \t%20d%20d", p, q);
printf("\n\n");
printf("Incremented Pointers:\t%20d%20d", p+1, q+1);
printf("\n\n");
printf("Pointer values: %20d%20d", *p, *q);
printf("\n\n");
return 0;
}
這裏是它的輸出:
p q
Original Pointers: 132021776 132021776
Incremented Pointers: 132021796 132021780
Pointer values: 132021776 1
指針
p
,通過跳躍20時遞增。這是因爲它是int(*)[5]
類型的指針,因此在數組中跳到sizeof(int) * number of columns
?兩個
p
和q
使用與p
間接運算符時的值相同(但不同類型的),然而,我不會在數組的第一個單元格中獲得的價值,而不是我得到的值p
本身打印出來。爲什麼是這樣?當我使用int *p = &a
時,它引發了一個警告(由於不同類型的指針,但後來當我使用間接運算符與p,我可以得到它打印數組中的第一個單元格的值)。這是因爲當我給你&a
到p
,其轉換的&arr
的類型int *
類型(這是int (*) [5]
),然後分配給p
?
你的代碼是未定義行爲;你必須使用'%p'指定符打印地址,並將參數轉換爲'void *'。 –
注意:不要使用'%d'來打印指針,'int'對於指針來說可能太小(並且它在典型的64位系統上是*) –
對於簡單的分配約束違規,gcc給出了很差的診斷。確保使用'gcc -std = c11 -pedantic-errors'進行編譯,以使其正常運行。 – Lundin