2011-07-21 95 views
1

如果我有以下的例子:值分配給一個指針

int *x; 
x = func(a); 

對於聲明:x = func(a);,我們說,我們正在返回的地址x?或者,我們究竟如何閱讀它?

編輯是否有資格說我們正在返回一個指向x的指針?如果是這樣,你能解釋一下這是如何完成的嗎?我的意思是,我們如何返回一個指針?

回答

1

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是沒問題的,因爲你返回的值(地址)將被保存,就像它指向的內存一樣。

我也剛剛意識到我給你寫了一本書。該死的,當我累了的時候我肯定會漫步。

7

x是一個指向int,所以換句話說,它是其中一個int被存儲的存儲器位置的地址。因此x = func(a)意味着func返回int的地址並將其存儲在變量x中。

請注意不要在func返回後返回其內容未定義的局部變量的地址。

2

如果將變量的值賦給函數的返回類型,那麼返回類型必須與變量的類型匹配。這對於指針來說是一樣的。

所以,如果您有:

int* myPointer; 

而且......

int* func(); 

然後設置myPointer等於FUNC()將改變存儲地址,該地址 「myPointer」 點,至內存地址由func()返回。

0

這意味着func()返回一個int *類型的變量。

是否有資格說我們正在返回一個指向x的指針?

不,我們正在返回一個指向整數的指針,並將其指定給x,因爲它是一個指針。

這是一個示例代碼返回int指針
int* func(int a)
{
int *y = &a;
return y;
}

1

聲明剛剛讀取x被分配由函數func返回的值。爲了編譯沒有錯誤的代碼,func應該返回一個地址。並且要按照預期的那樣執行代碼AlexFZ指出,您應該注意func不會返回該函數局部變量的地址。

4

回覆:您的編輯:

編輯:是否有資格說,我們正在返回一個指向X?如果是這樣,你能解釋一下這是如何完成的嗎?我的意思是,我們如何返回一個指針?

是的,它當然有資格。嘗試並將指針視爲任何其他數據類型。在引擎蓋下,它們只是內存地址。一個指針可以返回任何其他數據類型可以返回的方式。

拿這個代碼,例如:

int* giveMeAPointer() { 
    return y; 
} 
int* x = giveMeAPointer(); 

說是 「Y」 是全局聲明如下: 「詮釋* Y = ...」。現在,由「x」指向的存儲器地址與由「y」指向的存儲器地址相同。

現在我們假設「y」沒有被聲明爲指針,而是作爲一個普通的int(例如「int y = 5」)聲明。該功能可以做到這一點,仍然有效:

int* giveMeAPointer() { 
    int* result = &y; 
    return result; 
} 
3

*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