這可能是一個非常簡單的問題,但我似乎無法在網上找到明確的答案。假設有一個指向數組的指針,聲明爲:操縱指針指向的內容
static char newMessage [400]; char * p =&newMessage; (我不知道這是否是正確的)我將如何去處理newMessage數組只使用指針。我這樣做是因爲C無法返回數組,但可以返回指向數組的指針。請溫柔,我是新
這可能是一個非常簡單的問題,但我似乎無法在網上找到明確的答案。假設有一個指向數組的指針,聲明爲:操縱指針指向的內容
static char newMessage [400]; char * p =&newMessage; (我不知道這是否是正確的)我將如何去處理newMessage數組只使用指針。我這樣做是因爲C無法返回數組,但可以返回指向數組的指針。請溫柔,我是新
你的代碼是差不多正確;唯一的問題是你有不匹配的指針類型。你想:
char *p = newMessage;
不:
char *p = &newMessage;
後者試圖初始化p
,一個char *
變量,用char (*)[400]
類型的值,它是無效的C.
你之後已創建並初始化p
,您可以使用它,但是您可以使用它:
p[6] = 12;
或類似的東西。
指針就指向數組
char* p = newMessage ;
而且從函數返回。
您可以像使用指向的數組一樣使用它。
newMessage[2] = '\0'
p[2] = '\0'
其實,這應該是char *p = newMessage;
.The char[]
行爲類似於char*
。 您稍後將通過修改任何指針來修改它。順便說一句,這是非常基本的,所以最好你閱讀教程。 另外,既然你問了這個,如果你打算返回一個指向數組的指針,那麼數組最好不要分配在堆棧上。它應該是堆分配(這是你的情況,因爲靜態)
在聲明像static char newMessage[400]
陣列,所述標識符newMessage
由第一元件陣列的的地址取代,並且它的行爲就像一個指針。
char* p= newMessage;
char* q= "Hi, world";
newMessage[4]= 'x';
p[4]= 'x';
*(newMessage + 2)= 0;
*(p+2)= 0;
strlen(newMessage);
strlen(q);
strcmp(newMessage, "Hi world");
strcmp(p, q);
都是有效的表達式。
請注意,在最後的四個函數調用中,您不是傳遞數組,而是指向字符串的第一個字符的指針。按照慣例,函數掃描內存直到找到空字節終止符。
你實際上不能操作數組,因爲數組在c中不是第一類類型。
幾乎所有你關心的數組名都會使其退化爲一個指針。例外是sizeof
,因此您可以使用sizeof array/sizeof *array
來獲取元素數。
你能做什麼,就是改變數組元素的值。使用指針算術和取消引用*
。指數運算符a[b]
是*(a+b)
的語法糖。
此外,您可以使用庫函數(或您自己的),它接受指針。
這使得我的代碼最終沒有任何警告地編譯,現在我只需要處理我遇到的seg錯誤錯誤:D –
@ OP-使用這種方法,使用返回指針的代碼只需手動記住它指向400個字節的分配空間。這有點脆弱,會導致錯誤發生,所以要小心。 –