2011-01-23 214 views
0

我在這裏問一個問題:C++ - class issueC++ - 指針函數參數

什麼我還沒有得到的是指針參數在這裏:

void setInfo(char *strName,int id,double wage) 

當它被稱爲:

abder.setInfo("Abder-Rahman",123,400); 

我知道該數組的名稱是一個指針。但是,爲什麼我們必須有一個指針數據類型?我們不能在函數參數列表中使用char[]嗎?正如我認爲當我嘗試時發生錯誤。

謝謝。

+5

你需要自己寫一本好書。這是目前學習C++最好的獨奏方式。 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2011-01-23 10:32:48

回答

2

作爲參考,從C++ 03標準,§ 8.3.5 3:

確定每個參數的類型,類型的任何參數「陣列T的」或「功能返回T」之後被調節到分別是「指向T的指針」或「返回函數的指針」。

此外,[]聲明的陣列是一個不完整的對象類型(§ 8.3.4 1),儘管聲明一個函數參數時,因爲它會被轉換爲一個指針這應該不會造成問題。

3

但是,爲什麼我們必須有一個指針數據類型?

因爲編譯函數時需要知道函數參數的大小。即該函數需要知道內存中的參數列表有多遠才能找到idwage

我們不能在函數參數列表中使用char []嗎?

是的,你可以,但它仍然通過指針傳遞。在被調用的函數內部保留了數據作爲數組的一部分的附加屬性(例如返回數組總大小的sizeof())。在函數簽名中使用[]的能力僅僅是一個指示器,通過的項目應該是某種類型的數組(而不是指向結構的指針)。

+0

感謝您的回覆。當我試圖在函數簽名中使用[]時,像這樣:「char [] strName」我得到一個錯誤。我應該如何將它作爲參數編寫?謝謝。 – Simplicity 2011-01-23 15:50:23

+0

@SWEngineer:「錯誤」非常「特定」:)什麼是實際的錯誤信息?此外,它應該是`char strName []`不`char [] strName` :) – 2011-01-23 19:57:05

1

char []也是一個指針。是的,你可以使用它。

+1

只作爲函數參數的聲明,否則`char []`是一個不完整的數組類型。 – 2011-01-23 10:44:13

+0

爲真。我不喜歡它,我更喜歡* :) – 2011-01-23 11:17:53

1

數組和指針有很大關係 - 你甚至可以用一個指針像數組一樣

void foo(char *ptr) { 
    ptr[2] = 'x'; 
} 

在你的情況,你會得到,因爲字面字符串編譯錯誤(或警告)(如"foo")被認爲是const的,也就是說它們可能不會被修改,並且由於沒有使用const指針的函數沒有作出承諾而不改變它,所以編譯器拒絕將它交給字符串文字。

你需要做

void setInfo(const char *strName,int id,double wage) 

一般情況下,你應該總是使用const的指針和引用參數,除非你打算修改的對象。