如果我有以下的例子:值分配給一個指針
int *x;
x = func(a);
對於聲明:x = func(a);
,我們說,我們正在返回的地址x
?或者,我們究竟如何閱讀它?
編輯:是否有資格說我們正在返回一個指向x
的指針?如果是這樣,你能解釋一下這是如何完成的嗎?我的意思是,我們如何返回一個指針?
如果我有以下的例子:值分配給一個指針
int *x;
x = func(a);
對於聲明:x = func(a);
,我們說,我們正在返回的地址x
?或者,我們究竟如何閱讀它?
編輯:是否有資格說我們正在返回一個指向x
的指針?如果是這樣,你能解釋一下這是如何完成的嗎?我的意思是,我們如何返回一個指針?
x是一個指針,專指int。所以應該很明顯,有兩個存儲位置被使用。一個用於指針,另一個用於指向的內存(假設指針不爲空)。
指針本身包含一個內存地址,特別是它所指向的內存的位置。類似於0xa456e4fa。
是的,func()返回一個指針。 func的原型如下所示:
int * func(someObj a); //I don't know the datatype of your parameter,
//so I'm just making something up.
注意返回類型是指向int的指針。從這個以及之前我所說的,這應該是顯而易見的。一些形式爲0xyyyyyy的內存地址/指針。該內存地址進入你的x指針。
請記住,指針本身不包含它指向的數據,它只是地址。沒有理由不能返回指針。但是,您在返回的內容時需要小心。您不希望返回局部變量的地址,因爲該函數完成執行後該變量將超出範圍。然後,您將返回無效的地址。然而,返回一個本地指針的VALUE是沒問題的,因爲你返回的值(地址)將被保存,就像它指向的內存一樣。
我也剛剛意識到我給你寫了一本書。該死的,當我累了的時候我肯定會漫步。
x
是一個指向int
,所以換句話說,它是其中一個int
被存儲的存儲器位置的地址。因此x = func(a)
意味着func
返回int
的地址並將其存儲在變量x
中。
請注意不要在func
返回後返回其內容未定義的局部變量的地址。
如果將變量的值賦給函數的返回類型,那麼返回類型必須與變量的類型匹配。這對於指針來說是一樣的。
所以,如果您有:
int* myPointer;
而且......
int* func();
然後設置myPointer等於FUNC()將改變存儲地址,該地址 「myPointer」 點,至內存地址由func()返回。
這意味着func()返回一個int *類型的變量。
是否有資格說我們正在返回一個指向x的指針?
不,我們正在返回一個指向整數的指針,並將其指定給x,因爲它是一個指針。
這是一個示例代碼返回int指針
int* func(int a)
{
int *y = &a;
return y;
}
聲明剛剛讀取x被分配由函數func
返回的值。爲了編譯沒有錯誤的代碼,func應該返回一個地址。並且要按照預期的那樣執行代碼AlexFZ
指出,您應該注意func
不會返回該函數局部變量的地址。
回覆:您的編輯:
編輯:是否有資格說,我們正在返回一個指向X?如果是這樣,你能解釋一下這是如何完成的嗎?我的意思是,我們如何返回一個指針?
是的,它當然有資格。嘗試並將指針視爲任何其他數據類型。在引擎蓋下,它們只是內存地址。一個指針可以返回任何其他數據類型可以返回的方式。
拿這個代碼,例如:
int* giveMeAPointer() {
return y;
}
int* x = giveMeAPointer();
說是 「Y」 是全局聲明如下: 「詮釋* Y = ...」。現在,由「x」指向的存儲器地址與由「y」指向的存儲器地址相同。
現在我們假設「y」沒有被聲明爲指針,而是作爲一個普通的int(例如「int y = 5」)聲明。該功能可以做到這一點,仍然有效:
int* giveMeAPointer() {
int* result = &y;
return result;
}
*x
是指向int類型的變量在內存中。所以功能func
應該返回地址爲int。
int *x;
x = new int; // create your own int
*x = 5; // access - set it's value
delete x; // delete int - free memory
x = getGlobalCounter();
(*x)++; // increment global pointer
例如,getGlobalCounter功能:
static int counter;
int *getGlobalCounter() {
return &counter; // return address of counter
}
但並不總是刪除對象從函數返回的好主意。在這種情況下,它應該會導致運行時錯誤,因爲計數器不像上面的例子那樣動態分配int
。