簡體   English   中英

相同的兩個指針操作的不同行為

[英]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 + 2a類型為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM