[英]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.