[C++]指標和引用(二)
指標和引用
陣列名作函式引數
陣列名可以作函式的實參和形參,傳遞的是陣列的地址。這樣,實參、形參共同指向同一段記憶體單元,記憶體單元中的資料發生變化,這種變化會反應到主調函式內。
在函式呼叫時,形引數組並沒有另外開闢新的儲存單元,而是以實引數組的首地址作為形引數組的首地址。這樣形引數組的元素值發生了變化也就使實引數組的元素值發生了變化。
既然陣列做形參沒有開闢新的記憶體單元,接受的只是實引數組的首地址,那麼,這個首地址也可以在被調函式中用一個指標變數來接受,通過在被調函式中對這個指標變數的指向進行操作而使實引數組發生變化。
四、指向多維陣列的指標和指標變數
用指標變數也可以指向多維陣列,表示的同樣是多維陣列的首地址。
可以將a陣列看作一個一維陣列,這個一維陣列的每個元素又是一個具有4個int型資料的一維陣列,這樣,我們就可以利用一維陣列的概念來標記一些寫法。
a[0]=*(a+0) a+0為a[0]的地址&a[0],其值為2000H。
a[1]=*(a+1) a+1為a[1]的地址&a[1],其值為2010H。
a[2]=*(a+2) a+2為a[2]的地址&a[2],其值為2020H。
a[0]為一維陣列名,其陣列有四個int型的元素:
a[0][0],a[0][1],a[0][2],a[0][3]
同樣,a[0]代表一維陣列的首地址,所以,a[0]為&a[0][0]。
a為二維陣列名,a+1為a[1]的地址,也就是陣列第一行的地址,所以a為行指標。
a[1]為一維陣列名,a[1]+1為a[1][1]的地址,也就是陣列第一行第一列的地址,所以a[1]為列指標。
可以看到:a, a+0 , *(a+0), a[0], &a[0][0]表示的都是2000H,即二維陣列的首地址。
實際上,a[0], a[1], a[2]並不是實際的元素,它們在記憶體並不佔具體的儲存單元,只是為了我們表示方便起見而設計出的一種表示方式。
字串的指標和指向字串的指標變數
字串的表示形式
1、用字元陣列實現
void main(void )
{ char string[ ]=“I love China”;
cout<<string;
}
string為陣列名,代表陣列的首地址,是常量。
2、用字元指標表示字串
void main(void)
{ char *string=“I love China”;
cout<<string;
}
將記憶體中字串常量的首地址賦給一個指標變數
字串指標作函式引數
將一個字串從一個函式傳遞到另一個函式,可以用地址傳遞的辦法。即用字元陣列名作引數或用指向字串的指標變數作引數。在被調函式中可以改變原字串的內容。
字元指標變數與字元陣列
字元陣列和字元指標變數都可以實現字串的儲存和運算,區別在於:
字元陣列名是常量,定義時必須指明佔用的空間大小。
字元指標變數是變數,裡面儲存的是字元型地址,可以整體賦值,但字串必須以‘\0’結尾。
函式的指標和指向函式的指標變數
可以用指標變數指向變數、字串、陣列,也可以指向一個函式。
一個存放地址的指標變數空間可以存放資料的地址(整型、字元型),也可以存放陣列、字串的地址,還可以存放函式的地址。
函式在編譯時被分配給一個入口地址。這個入口地址就稱為函式的地址,也是函式的指標。像陣列一樣,C++語言規定,函式名就代表函式的入口地址
專門存放函式地址的指標變數稱為指向函式的指標變數。
函式名max代表函式在記憶體中的入口地址,是一個常量,不可被賦值。
而指向函式的指標變數 p 可以先後指向不同的同種型別的函式。但不可作加減運算。
實參:實際的函式名(函式地址)
形參:指向函式的指標變數
與實參函式的型別完全一致(返回值、引數)
通用函式:所有的內部函式呼叫都用函式指標呼叫
返回指標值的函式
被調函式返回的不是一個資料,而是一個地址。所以函式的型別為指標型別。
指標陣列和指向指標的指標
指標陣列的概念
一個陣列,其元素均為指標型別的資料,稱為指標陣列。也就是說,指標陣列中的每一個元素都是指標變數,可以放地址。
常用字元指標陣列,陣列中的元素指向字串首地址,這樣比字元陣列節省空間。
指向指標的指標變數
同樣,p也有地址,可以再引用一個指標變數指向它。
稱prt為指向指標的指標變數。其基型別是指向整型資料的指標變數,而非整型資料。
指標陣列作main( )函式的形參
程式是由main( )函式處向下執行的。main函式也可以帶引數。
其它函式由main函式呼叫的,即在程式中呼叫的,但main函式卻是由DOS系統呼叫的,所以main函式實參的值是在DOS命令列中給出的,是隨著檔案的執行命令一起給出的。
main函式形參的形式:
main( int argc, char * argv[ ])
main( int argc, char **argv)
argc為命令列中引數的個數(包括檔名);
argv為指向命令列中引數(字串)的指標陣列。
小結
1、指標變數可以有空值,即指標變數不指向任何地址。
2、兩指標可以相減,不可相加。若要進行相減運算,則兩指標必須指向同一陣列,相減結果為相距的陣列元素個數
3、指向同一陣列的兩個指標變數可以比較大小:p2>p1
在記憶體動態分配儲存空間
在定義變數或陣列的同時即在記憶體為其開闢了指定的固定空間。
int n, a[10];
char str[100];
一經定義,即為固定地址的空間,在記憶體不能被別的變數所佔用。
在程式內我們有時需要根據實際需要開闢空間,如輸入學生成績,但每個班的學生人數不同,一般將人數定得很大,這樣佔用記憶體。
相關文章
- 詳解c++指標的指標和指標的引用C++指標
- java的引用:用C++/C的引用和指標去理解JavaC++指標
- C++ 學習筆記(3):引用和指標C++筆記指標
- C/C++引用和指標的聯絡和區別C++指標
- 1.0 - 指標和引用指標
- c++ 類的函式引用 指標C++函式指標
- c++指標傳遞與引用傳遞C++指標
- 指標和引用的區別指標
- C++中const與指標、引用的總結C++指標
- C++智慧指標學習——小談引用計數C++指標
- c++中指標和引用的區別?C++指標
- C++ 引用和指標:記憶體地址、建立方法及應用解析C++指標記憶體
- [C++] 成員函式指標和函式指標C++函式指標
- 【C++系列】指標物件和物件指標的區別C++指標物件
- C++ this 指標C++指標
- C++ 指標C++指標
- C++智慧指標之shared_ptr與右值引用(詳細)C++指標
- C++中傳指標和傳引用的區別,各自的使用場景是什麼C++指標
- GO切片傳值/引用/指標Go指標
- 引用的底層為指標指標
- 透過指標引用陣列指標陣列
- C++指標理解C++指標
- C++智慧指標C++指標
- C++ 指標和迭代器支援的操作C++指標
- 指標陣列和陣列指標與二維陣列指標陣列
- C++中指標與引用詳解C++指標
- Golang指標隱式間接引用Golang指標
- 指向指標的常量引用瞭解指標
- C++ 右值引用和左值引用C++
- PLC結構化文字(ST)——指標和引用(Pointer&Reference)指標
- c++ 函式指標C++函式指標
- C++(函式指標)C++函式指標
- C++中的this指標C++指標
- C/C++指標總結C++指標
- 1-7 C++指標C++指標
- C++進階(智慧指標)C++指標
- C++ 類成員指標C++指標
- 常量引用或指向常量的指標,其所指物件可以是非const物件(C++)指標物件C++
- C++ 用智慧指標這樣包裝 this 指標是否可行C++指標