指針與數(shù)組
- 數(shù)組的地址:
數(shù)組名、&數(shù)組首元素 - 指針是專門用于保存地址
- 由于數(shù)組的首元素的地址就是數(shù)組的地址,所以定義一個指針指向數(shù)組其實就是定義一個指針指向數(shù)組的首元素,所以數(shù)組的首元素是什么類型,那么指向數(shù)組的指針就是什么類型
int ages[] = {1,2,3};
// 下面兩種方式都可以
int *p = &ages[0];
int *p = ages;
- 因為p指針存儲的值和ages中存儲的值相同,所以以前用ages得地方都可以使用p代替
int ages[] = {1,2,3};
int *p = ages;
p[0] = 888;
指針的用途
- 取值的時候,會根據(jù)指針類型所占用的字節(jié)去取出對應(yīng)字節(jié)的數(shù)據(jù)
- 用于做加法運算,
指針+1,其實是加上指針類型所占用的長度
int ages[] = {1,5,10,15};
int *p = ages;
printf("%i\n",*p); // 輸出1
printf("%i\n",*(p + 1));// 輸出5
printf("%i\n",*(p + 2));// 輸出10
printf("%i\n",*(p + 3));// 輸出15
指針和字符串
- 因為數(shù)組名就是數(shù)組的地址,數(shù)組名保存的就是數(shù)組的第0個元素的地址,所以我們可以使用指針來保存字符串
- 通過指針保存一個字符串,其實就是保存的字符串的第0個元素的地址
char str[] = "yaof";
char *str2 = "yaof";
數(shù)組和指針保存字符串的區(qū)別:
如果通過數(shù)組來保存字符串,那么字符串是一個
變量str,可以修改如果通過指針來保存字符串,那么字符串是一個
常量str2,不可以修改數(shù)組保存的字符串存儲在內(nèi)存的
棧中,而通過指針保存的字符串存儲在常量區(qū)存儲在棧中的變量有一個特點,當(dāng)作用域結(jié)束系統(tǒng)會自動釋放該變量
存儲在常量區(qū)中得值有一個特點,不會被釋放,而且多個相同的值對應(yīng)的地址相同
注意:用指針來保存字符串不可以修改
注意:指針不初始化不能隨便使用
指針數(shù)組
char *names[4] = {"jiang", "zhao", "wang", "liu"};
函數(shù)指針
-
指向函數(shù)的指針的定義格式:
返回值類型 (*指針變量名)(參數(shù)列表)- *: 代表是一個指針
- 指針變量名:代表指針變量的名稱,區(qū)分不同的變量
- (*指針變量名):代表將來指向一個函數(shù)
- 返回值類型:代表指向的函數(shù)是否有返回值
- (參數(shù)列表):代表指向的函數(shù)的參數(shù)列表,沒有參數(shù)時使用()
-
函數(shù)指針分成四種類型
- 沒有返回值,沒有參數(shù)
- 沒有返回值,有參數(shù)
- 有返回值,沒有參數(shù)
- 有返回值,有參數(shù)
// 沒有返回值,沒有參數(shù)
void (*functionP)();
functionP = sum;// 函數(shù)后面不能加括號
functionP();// 調(diào)用函數(shù)
// 沒有返回值,有參數(shù)
void (*functionP)(int, int);
// 有返回值,沒有參數(shù)
int (*functionP)();
// 有返回值,有參數(shù)
int (*functionP)(int,int);