指標指向null 深入理解雙指標的兩種用法

2021-10-11 11:41:13 字數 1344 閱讀 1449

好久沒有用過c/c++的二級指標了,總覺的它就是指標的指標,沒什麼大不了的,但是今天看到一道面試題,感覺自己對二級指標的理解還是不夠深刻。於是,從網上找資料,學習了一番……

題目是這樣的:

#include "stdafx.h"#include using namespace std;void getmemory(char *p, int num)int _tmain(int argc, _tchar* ar**)
問:程式能否達到目的:在getmemory()中為main函式中的開闢空間,並將str指向這段空間?

分析:str是乙個指標,指向null,形參p也是乙個指標,初始也指向null,在getmemory函式中,這個指標又指向了新開闢的空間。但是只是形參的指向改變了,實參str仍然指向null,並沒有改變。因此,程式達不到題目的要求,而且執行時會出現錯誤,由於str一直指向null,執行strcop時,會出現錯誤,提示某某記憶體不能寫入。

正確的方法應該採用雙指標,程式如下:

#include "stdafx.h"#include using namespace std;void getmeory(char **p, int num)int _tmain(int argc, _tchar* ar**)
分析:str是乙個指標,指向null。而呼叫getmemory函式時,傳遞的是str的位址,p是乙個二級指標,*p是乙個指標。因此,將str的位址賦給臨時變數p,則*p就是指標str的值,改變*p的值就相當於改變str的值。因此這種方法能夠得到題目要求的效果。另外還有一種方法,採用一級指標,讓函式返回乙個指標變數,指向新分配的記憶體,程式如下:

#include "stdafx.h"#include using namespace std;char * getmeory2(char *p, int num)int _tmain(int argc, _tchar* ar**)
2. 另外用二級指標還經常用在動態申請二維陣列。

void main()
這樣就實現了二維陣列的動態申請,因為一般陣列宣告時,不允許下標是變數,所以如果想動態決定陣列各維的大小,最好這樣做。

附:關於指標的一些定義

深入理解雙指標

對於c語言的引數傳遞都是值傳遞,當傳傳遞乙個指標給函式的時,其實質上還是值傳遞,除非使用雙指標。在講雙指標之前,還是先講講關於c語言函式呼叫的本質。函 數呼叫操作包括從一塊 到另一塊 之間的雙向資料傳遞和執行控制轉移。資料傳遞通過函式引數和返回值來進行,包括區域性變數的空間分配與 都是通過 棧來實現...

深入理解指標

指標 是乙個特殊的變數 它裡面儲存 的數值被解釋成為記憶體裡的乙個位址 指標也是一種資料型別,並且也是有值的。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 ...

深入理解指標

指標 是乙個特殊的變數 它裡面儲存 的數值被解釋成為記憶體裡的乙個位址 指標也是一種資料型別,並且也是有值的。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 ...