好久沒有用過c/c++的二級指標了,總覺的它就是指標的指標,沒什麼大不了的,但是今天看到一道面試題,感覺自己對二級指標的理解還是不夠深刻。於是,從網上找資料,學習了一番……
題目是這樣的:
[cpp]view plain
copy
#include "stdafx.h"
#include
using
namespace
std;
void
getmemory(
char
*p,
intnum)
int_tmain(
intargc, _tchar* argv)
問:程式能否達到目的:在getmemory()中為main函式中的開闢空間,並將str指向這段空間?
分析:str是乙個指標,指向null,形參p也是乙個指標,初始也指向null,在getmemory函式中,這個指標又指向了新開闢的空間。但是只是形參的指向改變了,實參str仍然指向null,並沒有改變。因此,程式達不到題目的要求,而且執行時會出現錯誤,由於str一直指向null,執行strcop時,會出現錯誤,提示某某記憶體不能寫入。
正確的方法應該採用雙指標,程式如下:
[cpp]view plain
copy
#include "stdafx.h"
#include
using
namespace
std;
void
getmeory(
char
**p,
intnum)
int_tmain(
intargc, _tchar* argv)
分析:str是乙個指標,指向null。而呼叫getmemory函式時,傳遞的是str的位址,p是乙個二級指標,*p是乙個指標。因此,將str的位址賦給臨時變數p,則*p就是指標str的值,改變*p的值就相當於改變str的值。因此這種方法能夠得到題目要求的效果。另外還有一種方法,採用一級指標,讓函式返回乙個指標變數,指向新分配的記憶體,程式如下:
[cpp]view plain
copy
#include "stdafx.h"
#include
using
namespace
std;
char
* getmeory2(
char
*p,
intnum)
int_tmain(
intargc, _tchar* argv)
2. 另外用二級指標還經常用在動態申請二維陣列。
[cpp]view plain
copy
void
main()
這樣就實現了二維陣列的動態申請,因為一般陣列宣告時,不允許下標是變數,所以如果想動態決定陣列各維的大小,最好這樣做。
附:關於指標的一些定義,參考譚浩強 p177,p191
雙指標的兩種用法
好久沒有用過c c 的二級指標了,總覺的它就是指標的指標,沒什麼大不了的,但是今天看到一道面試題,感覺自己對二級指標的理解還是不夠深刻。於是,從網上找資料,學習了一番 題目是這樣的 cpp view plain copy include stdafx.h include using namespac...
雙指標的兩種用法
題目是這樣的 include using namespacestd void getmemory char p,int num int main int argc,char argv 問 程式能否達到目的 在getmemory 中為main函式中的開闢空間,並將str指向這段空間?分析 str是乙個...
雙指標的兩種用法
好久沒有用過c c 的二級指標了,總覺的它就是指標的指標,沒什麼大不了的,但是今天看到一道面試題,感覺自己對二級指標的理解還是不夠深刻。於是,從網上找資料,學習了一番 題目是這樣的 cpp view plain copy include stdafx.h include using namespac...