[英]Different behavior of the same two operations on pointers
我寫了這段代碼,輸出就像這樣的BCDE
char a[5] = {'A' , 'B' , 'C' , 'D'};
char *b = a + 2;
int i = 0 ;
for(i = 0 ; i < 4 ; i ++)
{
*b = (a[i] + 1);
printf("%c",*b);
}
但是當我添加這樣的引用時:
char a[5] = {'A' , 'B' , 'C' , 'D'};
char *b = &a + 2;
int i = 0 ;
for(i = 0 ; i < 4 ; i ++)
{
*b = (a[i] + 1);
printf("%c",*b);
}
輸出變為B
這與指針算術的完成方式有關。 當您向指針添加值時,它會將指針增加該值乘以其引用類型的大小。
在表達式a + 2
, a
類型為char *
,因此加2將地址增加2 * sizeof(char) == 2
個字節。
給定&a + 2
, &a
類型為char (*)[5]
,即指向5 char
數組的指針。 加2會使地址增加2 * sizeof(char [5]) == 10
個字節。 這指向數組末尾的內存位置,因此取消引用它會調用未定義的行為 ,在這種情況下,這會導致循環提前退出。
在第二種情況下,您還具有無效的分配,因為您試圖將char (*)[5]
類型的值分配給char *
類型的值。
編譯器應報告錯誤
char a[5] = {'A' , 'B' , 'C' , 'D'};
char *b = &a + 2; // <<< compile error
int i = 0 ;
for(i = 0 ; i < 4 ; i ++)
{
*b = (a[i] + 1);
printf("%c",*b);
}
並且如果您刪除了產生編譯錯誤的行,則輸出應該與第一段代碼沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.