2013-01-02 17 views
2

非常簡單,我正在重新學習C++,而且我很注重指針。我瞭解基本概念,但我有點麻煩。 調用這個函數的語法是什麼?在C++中使用指針調用函數

void getTime(int& hours, int& minutes, int& seconds) const 
{ 
    hours = hr; 
    minutes = min; 
    seconds = sec; 
} 

功能的點,因爲你可能已經猜到,是在位於任何範圍的函數調用是在小時,分鐘和秒的時間回到三分。假設小時,分鐘,和sec已經被定義。

此外,如果有人想詳細說明一點(特別是何時使用& *何時使用*),將不勝感激。預先感謝。

+3

你的代碼中沒有指針,在調用站點也沒有指針。 –

+0

應該是什麼指針? – 0x499602D2

+0

你正在使用引用,看看http://stackoverflow.com/questions/114180/pointer-vs-reference – Jerome

回答

4

調用函數將語法:

className.getTime(a, b, c); 

className是在其上定義了這個方法和ab類的名稱,c都是變量爲整數。參數列表中的和號&表示變量能夠修改其值。沒有它,你可以修改參數,但相應的參數不會被改變。這裏沒有指針的用法,而不是從我可以看到的地方。

也許你在混淆一元&與參數中的一個。一元&所做的是返回其操作數的內存地址。返回的地址恰好是一個指針;然而這與你的例子無關。

如果你想使用指針,你就必須利用函數簽名是這樣的:

void getTime(int* a, int* b, int* c) const 

*這裏表示該功能需要一個指針(一元*是間接引用)。我們把它叫做是這樣的:

int *a, *b, *c; 

getTime(a, b, c); 

或者這樣:

int a, b, c; 

getTime(&a, &b, &c); 

不同的是,在第一個例子中的變量是指針,所以沒有必要通過地址。在第二個例子中,我們需要傳遞地址,因爲它會提供一個指向對象的指針。

5

您的函數簽名使用&,它表示通過引用。這意味着,你只需調用你的功能

int h, m, s; 

// ... code ... 

getTime(h, m, s); 

因爲你的函數傳遞這些參數作爲參考,只要getTime()改變了傳遞的參數之一,改變傳播到功能之外,而不是由值,其中傳遞的參數更改僅限於功能範圍。

你可以通過指針變量,而不是達到類似的效果:

void getTime(int * hours, int * minutes, int * seconds) 
{ 
    // do stuff 
} 

// ... code ... 

int h, m, s; 
getTime(&h, &m, &s); 

在後一種情況下,&地址運算符。通過取消引用傳遞的地址,您的函數可以對其功能範圍之外的內存進行更改。

0

在你的問題中沒有指針,但有引用。該功能將被稱爲完全一樣,如果採取常規的論點,那就是:

//assuming an object called object that possesses the function: 
//I am assuming its a object-function because of the 'const' modifier 

int h, m, s; 

object.getTime(h,m,s); 

下面是指針和引用的區別的簡要說明:

指針店的內存地址另一個變量,並用*字符聲明。它們的值是一個整數,表示另一個變量在計算機內存中的位置;爲了獲得這個價值,你必須提領運營商(也*字符):

int * p; //p stores the location in memory of an int. 
p = new int; //pointers must be dynamically allocated to avoid segfaults 
p = &(some pre-existing int) //or set to the reference of another variable 

*p = 7;//The * is used to access the data the pointer "points to" 
delete p; //and must be deleted once they are done being used. 

引用像,它們包含常規數據,但在那些不同一般的變量,他們保持相同的內存位置當它們被傳遞給函數(可能有更多的這個,我知道你引用的行爲在這個問題上,雖然他們可能有一些其他的定義):

int& i; //i is an int. 
i = 7; //and can be assigned like one 
//and cannot be dynamically allocated or deleted 

希望這有助於。

+0

指針不需要動態分配。 'int * p; int j = 2; p =&j;'非常好。 – Yuushi

+0

@Yuushi啊是的。小小的監督。感謝您指出。 – ApproachingDarknessFish

1

這裏有什麼不是指針,但引用。兩者之間有一些顯着的差異。首先,引用不能是NULL,它們必須指向已經初始化的東西。其次,所需的語法是不同的。

舉個例子,如果你使用指針,該函數將有簽名:

void getTime(int* hours, int* minutes, int* seconds) const 
{ 
    hours = &hr; 
    minutes = &min; 
    seconds = &sec; 
} 

你會然後調用它像這樣:

int hours, minutes, seconds; 
hours = minutes = seconds = 0; 
getTime(&hours, &minutes, &seconds); 

參考類似的方式行事,也就是說,它們被用來改變傳入的基本參數,以及避免複製。但是,語法不同:

int hours, minutes, seconds; 
hours = minutes = seconds = 0; 
getTime(hours, minutes, seconds); //Notice & not required 

您什麼時候使用每個?一般來說,當你可以的時候利用參考,當你必須的時候指出。在現代C++中,指針經常被避開而偏向其他結構。對於諸如多態的事情,或者直接修改放入容器中的值,它們仍然是必需的(儘管這很可能超越你的位置,如果這些都沒有意義,那麼現在就忽略它)。

傳遞類或大對象時,請使用reference-to-const。因此,例如std::vector通常以void some_func(const std::vector<int>& v)的形式傳遞。如果你真的需要修改它,請參考void some_func(std::vector<int>& v)