手把手帶你搞懂C語言指針
前言
自學筆記,沒有歷史知識鋪墊(省略百度部分),C語言指針的使用
一、概念
1.*指針
指針: 內存資源的地址指針
變量:存放指針的盒子 32位操作系統中,其大小位32bit,即4個字節,64位為64bit,即8個字節,與指針數據類型無關
指針的數據類型: 表示指針要讀取的地址字節數,如:char *p;讀取1個字節,int *p讀取4個字節,具體選擇根據指向的變量調整
指針指向的內存空間一定要合法(存在,且有讀的權限)
int main() { int *p1; char *p2; //p1:4,p2:1 printf("p1:%lu,p2:%lu \n",sizeof(*p1),sizeof(*p2)); return 0; }
指針變量的寫法:*p_xx
指針變量通常以*p_開頭,是英文指針Pointer的首字母
2.&取址
&a 變量a的內存地址
int main() { int a = 12312312; int *p1; p1 = &a; //*p1指針指向變量的值:12312312,p1指向的內存地址E9C4AE18(等價於&a) printf("*p1:%d,p1指向的內存地址%X",*p1,p1); return 0; }
二、指針修飾符
1.const 常量指針
const char *p;
從右往左理解: *p指針 char指向1個字節的內容 const該字節內容為隻讀 場景:描述字符串
char *const p;
從右往左理解:*p指針 const指針方向為隻讀(無法切換) char指向的內容是1字節,內容允許修改 場景:硬件資源
const char *const p;
結合瞭上面1和2的限制,指針方向為隻讀,指向的內容為隻讀 場景:ROM設備
//以下兩個寫法的作用是一樣的 const char *p; char const *p; //以下兩個寫法的作用是一樣的 char *const p; char *p const;
2.volatile 特征指針
volatile char *p;防止優化指向內存地址(阻止指令重排)
3.typedef 別名指針
為指針起別名,復雜的指針場景使用,提高代碼可讀性
typedef char *xx_p
三、指針運算
1. ++ — + –
指針的運算都是指向地址的運算,最小單位為當前指針變量的數據類型所占的內存大小
如:p+1的效果為0x20+1*(sizeof(p))
2.[] 標簽訪問
指針指向的內存位置,標簽默認為0,及:p[0]
標簽訪問一般用於非線性訪問,如:訪問當前指針指向內存位置的後邊第二個位置p[2]效果為*(p+2)
使用標簽訪問,則取出的是標簽內存裡的值,而不是地址
C語言的標簽化默認是允許越界的,甚至用標簽掃描整個內存,修改不同應用的屬性
int main() { int a = 0x123; int a1 = 0x134; int a2 = 0x145; int *p; p = &a1; //*p:134 ,*(p-1):145 ,p[-1]:145,p[1]:123 printf("*p:%X ,*(p-1):%X ,p[-1]:%X,p[1]:%X \n",*p,*(p-1),p[-1],p[1]); return 0; }
四、指針邏輯操作
>= == <= != 指針可以做邏輯操作,比較大小,但實際運用的比較少
p1 > p2 指針所占的地址比較,意義不大
p1 == n 一般跟一個特殊值比較,比如p1 == 0x0,地址的無效值,結束標識,表示p1處理完瞭
*p1 > *p2 實際上是指向變量值的比較
註意:
指針必須是同類型比較才有意義
總結
本章主要為C語言指針
Segmentation fault 段錯誤異常,通常是指針指向問題引起
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!