一,運算符優(yōu)先級
- 括號第一,單目第二,乘除第三,加減第四,位移第五,關(guān)系第六,等于不等于第七,位與異或位或八九十,邏輯或和與十二十一,條件高于賦值,逗號運算最低。
二,數(shù)組地址分析
- 舉例:
int arr[5] = {1};
arr:0x0000
&arr[0]:0x0000
&arr:0x0000
arr+1:0x0004
&arr[0]+1:0x0004
&arr+1:0x0014 - 說明
arr數(shù)組名
&arr[0]:數(shù)組元素的首地址
三,數(shù)組定義及初始化
- 數(shù)組需定義并初始化,不能先定義后初始化
int arr[5];
arr[4] = {1}; //未聲明,若賦值則arr[4] = 1;
arr[5] = {1,2,5};//數(shù)組越界并且未聲明
- 數(shù)組初始化
int arr[5] = {1};
int arr[4] = {1,2,3,4};
int arr[3] = {[1] = 2}; //不建議
int buf[ ] = {1,2,3,4}; //不建議
int buf[ ] = {}; //ERROR
四,指針表示形式及初始化
- 表示形式
int *p; int* p; //內(nèi)核代碼里見的多 int * p; - 指針初始化
int *p = NULL; //OK,NULL空地址,是一個宏
int a = 3;
int *p = &a; //OK
int a = 3;
int *p;
p = &a; //OK
int *p;
*p = &a; //ERROR
五,地址間接取值并對其運算
- 間接運算
int *p = NULL;
printf("p = %p\n", p); //輸出 p = (nil)
printf("*p = %d", *p); //ERROR,空地址不能訪問里面的值
int *p = 10; //不能將常量直接賦值給指針
printf("p = %p\n", p); //輸出0xa
printf("*p = %d\n", *p); //內(nèi)存中并未分派0xa這塊內(nèi)存
int a = 3;
int *pa = &a;
int *pc = pa; //同類型指針可以直接轉(zhuǎn)換
char *pd = (char *)pa; //不強制轉(zhuǎn)換會有警告
六,指針的類型和指針所指向的類型
- 指針的類型:去掉變量名之后的部分
- 指針所指向的類型:去掉變量名及其前面的*
- 指針大小:64位機大小為8,32位機大小為4
七,數(shù)組和指針
1,數(shù)組元素訪問形式
int arr[5] = {1,2,3,4,5};
int *pa = arr;
arr[0];
*(arr);
*(pa);
pa[0];
2,野指針
- 沒有初始化,或者其指向的內(nèi)存被釋放,而指針沒有被置空
int *p; *p +=10; //直接使用會出錯 - 危害:造成系統(tǒng)資源浪費,容易曹誠位置的知名錯誤
3,指針地址運算
- 自增:指針向高地址方向移動
- 自減:指針向低地址方向移動
- 指針相減表示指針之間的距離,相加沒有意義
- 指針加減一個常量,表示地址向高字節(jié)或低地址方向移動
4,概念區(qū)分
int buf[3]; //數(shù)組,其大小為3,存放三個int常量 int *pb; //指針,其類型為int *型 int *arr[3]; //指針數(shù)組 int (*pa)[3]; //數(shù)組指針,又稱行指針