簡體   English   中英

C取消指向字符數組的指針

[英]C derenferencing pointer to character array

我試圖通過在教程中找到的這個小例子來掌握C指針:

#include <stdio.h>

int main() {
    char vowels[] = {'A', 'E', 'I', 'O', 'U'};
    char *pvowels = &vowels;

    printf(pvowels);
//  printf(*pvowels);
    return 0;
}

如果我對此進行編譯,則會收到警告“來自不兼容指針類型的初始化”,但它仍將編譯/運行,並打印AEIOU和一些隨機的垃圾字符。 我還假設* pvowels將是元音數組的第一個內存位置的字符,因此會打印一個“ A”,但它只會出現段錯誤。

我的兩個問題是:

為什么第一個printf打印出元音+垃圾?

為什么第二張打印紙不能僅打印出一個A?

使用&vowels您將獲得指向數組的指針,而不是數組中的第一個元素。 &vowels的類型為char(*)[5]

要解決此問題,您應該使用&vowels[0]獲取指向第一個元素的指針,或者依靠該數組自然衰減到指向其第一個元素的指針:

char *pvowels = vowels;

第二個問題是您將pvowels 字符串 ,但是字符串是帶有終止符的字符序列。 由於數組vowels沒有終結符,所以printf調用會越界,您的行為不確定

至於最后一個問題,當取消引用指針時,將獲得它所指向的位置的值。 因為數組的位置從數組的第一個元素開始,所以&vowels[0]&vowels指向相同的位置,因此,當取消引用pvowels將得到數組的第一個元素'A' 但是,您不能將其用作printf的第一個參數,因為printf函數希望它是一個字符串 (指向以零結尾的字符數組的指針),而不是單個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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