柚子快報(bào)邀請(qǐng)碼778899分享:C語(yǔ)言 ——深入理解指針(2)
柚子快報(bào)邀請(qǐng)碼778899分享:C語(yǔ)言 ——深入理解指針(2)
目錄
1. 數(shù)組名的理解2. 二級(jí)指針3. 指針數(shù)組4. 字符指針變量5. 數(shù)組指針變量6. 函數(shù)指針變量7. 函數(shù)指針數(shù)組
1. 數(shù)組名的理解
這里我們使用 &arr[0] 的方式拿到了數(shù)組第一個(gè)元素的地址,但是其實(shí)數(shù)組名本來(lái)就是地址,而且是數(shù)組首元素的地址,我們來(lái)做個(gè)測(cè)試。
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);
return 0;
}
輸出結(jié)果:
我們發(fā)現(xiàn)數(shù)組名和數(shù)組首元素的地址打印出的結(jié)果一模一樣,數(shù)組名就是數(shù)組首元素(第一個(gè)元素)的地址。
數(shù)組名如果是數(shù)組首元素的地址,那下面的代碼怎么理解呢?
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", sizeof(arr));
return 0;
}
輸出的結(jié)果是:40,如果arr是數(shù)組首元素的地址,那輸出應(yīng)該的應(yīng)該是4/8才對(duì)。
其實(shí)數(shù)組名就是數(shù)組首元素(第一個(gè)元素)的地址是對(duì)的,但是有兩個(gè)例外:
sizeof(數(shù)組名),sizeof中單獨(dú)放數(shù)組名,這里的數(shù)組名表示整個(gè)數(shù)組,計(jì)算的是整個(gè)數(shù)組的大小, 單位是字節(jié)&數(shù)組名,這里的數(shù)組名表示整個(gè)數(shù)組,取出的是整個(gè)數(shù)組的地址(整個(gè)數(shù)組的地址和數(shù)組首元素 的地址是有區(qū)別的)
除此之外,任何地方使用數(shù)組名,數(shù)組名都表示首元素的地址。
2. 二級(jí)指針
指針變量也是變量,是變量就有地址,那指針變量的地址存放在哪里?
這就是二級(jí)指針。
對(duì)于二級(jí)指針的運(yùn)算有:
*ppa 通過(guò)對(duì)ppa中的地址進(jìn)行解引用,這樣找到的是pa , *ppa 其實(shí)訪問(wèn)的就是pa .
int b = 20;
*ppa = &b;//等價(jià)于pa = &b;
**ppa 先通過(guò)*ppa 找到pa ,然后對(duì)pa 進(jìn)行解引用操作: *pa ,那找到的是a .
**ppa = 30;
//等價(jià)于*pa = 30;
//等價(jià)于a = 30;
3. 指針數(shù)組
指針數(shù)組,是存放指針的數(shù)組。
指針數(shù)組的每個(gè)元素都是用來(lái)存放地址(指針)的。
指針數(shù)組的每個(gè)元素是地址,又可以指向一塊區(qū)域。
4. 字符指針變量
在指針的類(lèi)型中我們知道有一種指針類(lèi)型為字符指針char* ;
int main()
{
char ch = 'w';
char *pc = &ch;
*pc = 'w';
return 0;
}
5. 數(shù)組指針變量
數(shù)組指針變量:存放的是數(shù)組的地址,能夠指向數(shù)組的指針變量。
int (*p)[10];
解釋?zhuān)簆先和*結(jié)合,說(shuō)明p是一個(gè)指針變量,然后指針指向的是一個(gè)大小為10個(gè)整型的數(shù)組。所以p是一個(gè)指針,指向一個(gè)數(shù)組,叫 數(shù)組指針。
這里要注意:[]的優(yōu)先級(jí)要高于號(hào)的,所以必須加上()來(lái)保證p先和結(jié)合。
數(shù)組指針類(lèi)型解析:
int (*p) [10] = &arr;
| | |
| | |
| | p指向數(shù)組的元素個(gè)數(shù)
| p是數(shù)組指針變量名
p指向的數(shù)組的元素類(lèi)型
6. 函數(shù)指針變量
函數(shù)指針變量是用來(lái)存放函數(shù)地址的。
#include
void test()
{
printf("hehe\n");
}
int main()
{
printf("test: %p\n", test);
printf("&test: %p\n", &test);
return 0;
}
輸出結(jié)果如下:
test: 005913CA
&test: 005913CA
確實(shí)打印出來(lái)了地址,所以函數(shù)是有地址的,函數(shù)名就是函數(shù)的地址,當(dāng)然也可以通過(guò)&函數(shù)名的方式獲得函數(shù)的地址。
如果我們要將函數(shù)的地址存放起來(lái),就得創(chuàng)建函數(shù)指針變量咯,函數(shù)指針變量的寫(xiě)法其實(shí)和數(shù)組指針?lè)浅n?lèi)似。如下:
void test()
{
printf("hehe\n");
}
void (*pf1)() = &test;
void (*pf2)() = test;
int Add(int x, int y)
{
return x + y;
}
int(*pf3)(int, int) = Add;
int(*pf3)(int x, int y) = &Add;//x和y寫(xiě)上或者省略都是可以的
函數(shù)指針類(lèi)型解析:
int (*pf3) (int x, int y)
| | ------------
| | |
| | pf3指向函數(shù)的參數(shù)類(lèi)型和個(gè)數(shù)的交代
| 函數(shù)指針變量名
pf3指向函數(shù)的返回類(lèi)型
int (*) (int x, int y) //pf3函數(shù)指針變量的類(lèi)型
7. 函數(shù)指針數(shù)組
函數(shù)指針數(shù)組是用來(lái)把函數(shù)的地址存到一個(gè)數(shù)組中。
int (*parr1[3])();
parr1 先和[] 結(jié)合,說(shuō)明 parr1是數(shù)組,數(shù)組的內(nèi)容是什么呢?
是int (*)() 類(lèi)型的函數(shù)指針。
柚子快報(bào)邀請(qǐng)碼778899分享:C語(yǔ)言 ——深入理解指針(2)
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。