指針與數(shù)組
- 數(shù)組的地址:
數(shù)組名
释涛、&數(shù)組首元素
- 指針是專門用于保存地址
- 由于數(shù)組的首元素的地址就是數(shù)組的地址,所以定義一個(gè)指針指向數(shù)組其實(shí)就是定義一個(gè)指針指向數(shù)組的首元素节槐,所以數(shù)組的首元素是什么類型段誊,那么指向數(shù)組的指針就是什么類型
int ages[] = {1,2,3};
// 下面兩種方式都可以
int *p = &ages[0];
int *p = ages;
- 因?yàn)閜指針存儲(chǔ)的值和ages中存儲(chǔ)的值相同,所以以前用ages得地方都可以使用p代替
int ages[] = {1,2,3};
int *p = ages;
p[0] = 888;
指針的用途
- 取值的時(shí)候析桥,會(huì)根據(jù)指針類型所占用的字節(jié)去取出對應(yīng)字節(jié)的數(shù)據(jù)
- 用于做加法運(yùn)算,
指針+1活翩,其實(shí)是加上指針類型所占用的長度
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
指針和字符串
- 因?yàn)閿?shù)組名就是數(shù)組的地址烹骨,數(shù)組名保存的就是數(shù)組的第0個(gè)元素的地址翻伺,所以我們可以使用指針來保存字符串
- 通過指針保存一個(gè)字符串材泄,其實(shí)就是保存的字符串的第0個(gè)元素的地址
char str[] = "yaof";
char *str2 = "yaof";
數(shù)組和指針保存字符串的區(qū)別:
如果通過數(shù)組來保存字符串,那么字符串是一個(gè)
變量
str吨岭,可以修改
如果通過指針來保存字符串拉宗,那么字符串是一個(gè)
常量
str2,不可以修改
數(shù)組保存的字符串存儲(chǔ)在內(nèi)存的
棧
中辣辫,而通過指針保存的字符串存儲(chǔ)在常量區(qū)
存儲(chǔ)在棧中的變量有一個(gè)特點(diǎn)旦事,當(dāng)作用域結(jié)束系統(tǒng)會(huì)自動(dòng)釋放該變量
存儲(chǔ)在常量區(qū)中得值有一個(gè)特點(diǎn),不會(huì)被釋放急灭,而且多個(gè)相同的值對應(yīng)的地址相同
注意:用指針來保存字符串不可以修改
注意:指針不初始化不能隨便使用
指針數(shù)組
char *names[4] = {"jiang", "zhao", "wang", "liu"};
函數(shù)指針
-
指向函數(shù)的指針的定義格式:
返回值類型 (*指針變量名)(參數(shù)列表)
- *: 代表是一個(gè)指針
- 指針變量名:代表指針變量的名稱姐浮,區(qū)分不同的變量
- (*指針變量名):代表將來指向一個(gè)函數(shù)
- 返回值類型:代表指向的函數(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);