2012-03-12 15 views
5

在C++中,我有一個字符數組定義爲:C++,製作一個指向字符數組

char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

我想修改這個數組從其他功能的值,而不將它傳遞給那些功能。這是你使用指針的地方嗎?

所以我的問題是什麼是一個指向這個char數組的指針的正確方法。我只需要製作一個指向第一個元素的指針,然後當我想要修改這些值時,我會遍歷內存,直到我點擊結束字符?

+0

剛看了這個,比0好多了。謝謝 – 2012-03-12 16:08:22

回答

14
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; 
+0

感謝您的編輯,v.clear。 – 2012-03-12 16:07:01

+0

嗨,我有一個簡單的問題。當你做char * p1 = miniAlphabet時,p1現在存儲數組第一個元素的地址。怎麼會,當我們做cout << p1 << endl時,我們得到整個char數組(在這種情況下是ABCDE)而不是第一個元素的地址? – 2017-04-17 22:44:36

+0

@DannyBrown因爲* cout *的創建者決定如此。它甚至可能總是爲任何char *指針編寫「hello world」,但它會是愚蠢的。如果你在寫文本的專業中最聰明的做法是打印一個char *作爲字符串。如果要打印指針地址,請執行* << static_cast (p1)* – xanatos 2017-04-18 06:32:08

1

po內存中數組的位置與第一個元素的位置相同。因此,例如,兩個函數簽名下面是等價的:

function changeArray(char[] myArray); 
function changeArray(char* myArray); 

你可以撥打任一版本是這樣的:如果你傳遞一個數組

changeArray(miniAlphabet); 

...或

changeArray(&(miniAlphabet[0])); 
+0

我的印象是char *是聲明中的常量。在這種情況下,第二個函數不能改變char數組的任何內容,而第一個可以? – MintyAnt 2012-03-12 16:03:20

+0

你不能在函數內改變char *的值,但你可以改變它指向的值,在這個例子中是數組。所以這兩個聲明都允許更改原始數組。 – Diego 2012-03-12 16:07:52

1

對一個函數來說,你是通過引用傳遞的,因爲數組變量實際上只是指向數組中第一個元素地址的指針。所以,你可以調用一個函數是這樣的:

funcName(miniAlphabet); 

和「參照」這樣的接收陣列:

void funcName(char *miniAlphabet) { 
    ... 
} 
1

總之,是的。當您創建數組時,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爲您提供了第一個元素的值。