指針的操作
操作 | 效果 |
---|---|
ptr=&a | 賦值 需要注意指針的類型和地址的類型需要相同 |
*ptr | 取值 得到指針指向的地址所存儲(chǔ)的值 |
&ptr | 取指針的地址 需要存放在**ptr2 這樣的類型中 它表示指向指針的指針 |
ptr+1或者ptr++ | 效果等同于指向數(shù)組的下一個(gè)元素 |
ptr-1或者ptr-- | 效果等于于指向數(shù)組的前一個(gè)元素 |
ptr2-ptr | 表示兩個(gè)指針相間隔的元素的數(shù)目 |
注意:指針不可以相加 也不能進(jìn)行乘除運(yùn)算
利用指針傳遞數(shù)組
- 如果傳遞的數(shù)組是允許改變的 直接利用指針傳遞即可
- 如果傳遞的數(shù)組是不允許改變的 使用const修飾指針:const int * ptr 這樣的話在你試圖修改數(shù)組的時(shí)候 編譯器會(huì)報(bào)錯(cuò)
關(guān)于const的其他內(nèi)容
- const int* ptr
- 表示指向常量的數(shù)組
- 允許改變其指向的地址 不允許修改其指向的地址所表示的值
- int* const ptr
- 表示常量類型的指針
- 允許修改器指向的地址所表示的值 但是不允許修改其指向的地址
- 將常量或非常量數(shù)據(jù)的地址賦給指向常量的指針是合法的 但是將常量數(shù)據(jù)的地址賦給普通指針是非法的
指針和多維數(shù)組
假設(shè)有一個(gè)二維數(shù)組 聲明為:int arr[4][2]
- arr == &arr[0]
- arr[0] == &arr[0][0]
- arr的類型為:int (*ptr) [4] 它是指向一個(gè)擁有4個(gè)int類型大小的數(shù)組的指針
- arr[0]的類型為:int *ptr 它是一個(gè)指向int類型的指針
- *arr==&arr[0][0] 因?yàn)閍rr存放第一行數(shù)組的首地址 對(duì)其求值就代表第一行數(shù)組 而一個(gè)數(shù)組代表的是該數(shù)組第一個(gè)元素的首地址
- **arr == arr[0][0] 兩次取值就是取出了數(shù)組中的元素的值 所以二維數(shù)組名必須取兩次值才可以取出數(shù)組中存儲(chǔ)的元素
注意 把非常量的地址賦給指向常量的指針是允許的 但是當(dāng)有兩層以上的間接運(yùn)算符的時(shí)候 就不再安全了
多維數(shù)組作為函數(shù)形式參數(shù)
需要使用如下形式 void function(int arr[][4]) 第一個(gè)方括號(hào)代表了這是一個(gè)指針