在C++中,我有一個字符數組定義爲:C++,製作一個指向字符數組
char miniAlphabet[] = {'A','B','C','D','E', '\0'};
我想修改這個數組從其他功能的值,而不將它傳遞給那些功能。這是你使用指針的地方嗎?
所以我的問題是什麼是一個指向這個char數組的指針的正確方法。我只需要製作一個指向第一個元素的指針,然後當我想要修改這些值時,我會遍歷內存,直到我點擊結束字符?
在C++中,我有一個字符數組定義爲:C++,製作一個指向字符數組
char miniAlphabet[] = {'A','B','C','D','E', '\0'};
我想修改這個數組從其他功能的值,而不將它傳遞給那些功能。這是你使用指針的地方嗎?
所以我的問題是什麼是一個指向這個char數組的指針的正確方法。我只需要製作一個指向第一個元素的指針,然後當我想要修改這些值時,我會遍歷內存,直到我點擊結束字符?
char miniAlphabet[] = {'A','B','C','D','E', '\0'};
這些是等同的。
char *p1 = miniAlphabet;
char *p2 = &(miniAlphabet[0]);
注意,()
是無用的運營商的優先級,所以
char *p3 = &miniAlphabet[0];
在C/C++的陣列的名稱是一個指針數組的第一個元素。
然後,您可以使用指針的數學做一些魔法......
這將指向第二個元素:
char *p4 = &miniAlphabet[0] + 1;
像
char *p5 = &miniAlphabet[1];
或
char *p6 = miniAlphabet + 1;
感謝您的編輯,v.clear。 – 2012-03-12 16:07:01
嗨,我有一個簡單的問題。當你做char * p1 = miniAlphabet時,p1現在存儲數組第一個元素的地址。怎麼會,當我們做cout << p1 << endl時,我們得到整個char數組(在這種情況下是ABCDE)而不是第一個元素的地址? – 2017-04-17 22:44:36
@DannyBrown因爲* cout *的創建者決定如此。它甚至可能總是爲任何char *指針編寫「hello world」,但它會是愚蠢的。如果你在寫文本的專業中最聰明的做法是打印一個char *作爲字符串。如果要打印指針地址,請執行* << static_cast
po內存中數組的位置與第一個元素的位置相同。因此,例如,兩個函數簽名下面是等價的:
function changeArray(char[] myArray);
function changeArray(char* myArray);
你可以撥打任一版本是這樣的:如果你傳遞一個數組
changeArray(miniAlphabet);
...或
changeArray(&(miniAlphabet[0]));
對一個函數來說,你是通過引用傳遞的,因爲數組變量實際上只是指向數組中第一個元素地址的指針。所以,你可以調用一個函數是這樣的:
funcName(miniAlphabet);
和「參照」這樣的接收陣列:
void funcName(char *miniAlphabet) {
...
}
總之,是的。當您創建數組時,miniAlphabet是一個指向您定義的大小和類型的數組的指針。這也是指向第一個元素的指針。
一個你正在建議的例子。
void foo(char *array)
{
array[0] = 'z';
array[2] = 'z';
}
...
char myArray[] = { 'a', 'b', 'c'};
foo(myArray);
//myArray now equals {'z', 'b', 'z'}
另外值得注意的是,解引用myArray爲您提供了第一個元素的值。
剛看了這個,比0好多了。謝謝 – 2012-03-12 16:08:22