c中指针简介
c中指針簡(jiǎn)介
首先我們來(lái)看一下指針的一些基本概念
于指針的應(yīng)用,平常有一些形式,總結(jié)了一下大概有這幾種用法
對(duì)于以上的幾種用法,我依次給出詳盡的解釋
//這是一個(gè)普通的整型變量
1 //首先從P 處開(kāi)始,先與*結(jié)合,所以說(shuō)明P 是一個(gè)指針,然后再與int 結(jié)合,說(shuō)明指針?biāo)赶虻膬?nèi)容的類(lèi)型為int 型.所以P是一個(gè)返回整型數(shù)據(jù)的指針
2 //首先從P 處開(kāi)始,先與[]結(jié)合,說(shuō)明P 是一個(gè)數(shù)組,然后與int 結(jié)合,說(shuō)明數(shù)組里的元素是整型的,所以P 是一個(gè)由整型數(shù)據(jù)組成的數(shù)組
3 //首先從P 處開(kāi)始,先與[]結(jié)合,因?yàn)槠鋬?yōu)先級(jí)比高,所以P 是一個(gè)數(shù)組,然后再與結(jié)合,說(shuō)明數(shù)組里的元素是指針類(lèi)型,然后再與int 結(jié)合,說(shuō)明指針?biāo)赶虻膬?nèi)容的類(lèi)型是整型的,所以P 是一個(gè)由返回整型數(shù)據(jù)的指針?biāo)M成的數(shù)組
4 //首先從P 處開(kāi)始,先與*結(jié)合,說(shuō)明P 是一個(gè)指針然后再與[]結(jié)合(與"()"這步可以忽略,只是為了改變優(yōu)先級(jí)),說(shuō)明指針?biāo)赶虻膬?nèi)容是一個(gè)數(shù)組,然后再與int 結(jié)合,說(shuō)明數(shù)組里的元素是整型的.所以P 是一個(gè)指向由整型數(shù)據(jù)組成的數(shù)組的指針**
5 //首先從P 開(kāi)始,先與結(jié)合,說(shuō)是P 是一個(gè)指針,然后再與結(jié)合,說(shuō)明指針?biāo)赶虻脑厥侵羔?然后再與int 結(jié)合,說(shuō)明該指針?biāo)赶虻脑厥钦蛿?shù)據(jù).由于二級(jí)指針以及更高級(jí)的指針極少用在復(fù)雜的類(lèi)型中,所以后面更復(fù)雜的類(lèi)型我們就不考慮多級(jí)指針了,最多只考慮一級(jí)指針.
6 從P 處起,先與()結(jié)合,說(shuō)明P 是一個(gè)函數(shù),然后進(jìn)入()里分析,說(shuō)明該函數(shù)有一個(gè)整型變量的參數(shù),然后再與外面的 int 結(jié)合,說(shuō)明函數(shù)的返回值是一個(gè)整型數(shù)據(jù)
7 //從P 處開(kāi)始,先與指針結(jié)合,說(shuō)明P 是一個(gè)指針,然后與()結(jié)合,說(shuō)明指針指向的是一個(gè)函數(shù),然后再與()里的int 結(jié)合,說(shuō)明函數(shù)有一個(gè)int 型的參數(shù),再與最外層的int 結(jié)合,說(shuō)明函數(shù)的返回類(lèi)型是整型,所以P 是一個(gè)指向有一個(gè)整型參數(shù)且返回類(lèi)型為整型的函數(shù)的指針**
8 //可以先跳過(guò),不看這個(gè)類(lèi)型,過(guò)于復(fù)雜從P 開(kāi)始,先與()結(jié)合,說(shuō)明P 是一個(gè)函數(shù),然后進(jìn)入()里面,與int 結(jié)合,說(shuō)明函數(shù)有一個(gè)整型變量參數(shù),然后再與外面的結(jié)合,說(shuō)明函數(shù)返回的是一個(gè)指針,然后到最外面一層,先與[]結(jié)合,說(shuō)明返回的指針指向的是一個(gè)數(shù)組,然后再與*結(jié)合,說(shuō)明數(shù)組里的元素是指針,然后再與int 結(jié)合,說(shuō)明指針指向的內(nèi)容是整型數(shù)據(jù).所以P 是一個(gè)參數(shù)為一個(gè)整數(shù)據(jù)且返回一個(gè)指向由整型指針變量組成的數(shù)組的指針變量的函數(shù).**
接下來(lái)我們具體來(lái)看一些指針類(lèi)型
字符指針
還有一種方式是把字符串的首地址放到字符指針中
那么會(huì)有這樣的一個(gè)問(wèn)題
上述程序的結(jié)果如下圖,為什么不一樣呢?
這里str3和str4指向的是一個(gè)同一個(gè)常量字符串。C/C++會(huì)把常量字符串存儲(chǔ)到單獨(dú)的一個(gè)內(nèi)存區(qū)域,當(dāng)幾個(gè)指
針。指向同一個(gè)字符串的時(shí)候,他們實(shí)際會(huì)指向同一塊內(nèi)存。但是用相同的常量字符串去初始化不同的數(shù)組的時(shí)候
就會(huì)開(kāi)辟出不同的內(nèi)存塊。所以str1和str2不同,str3和str4不同。
指針數(shù)組
數(shù)組指針
我們來(lái)看一段代碼
他的運(yùn)行結(jié)果為
所以我們會(huì)得出一個(gè)結(jié)論,那就是數(shù)組名和&數(shù)組名打印的地址是一樣的
但是真的是一樣的嗎?
我們?cè)賮?lái)看一段代碼
再來(lái)看看他們的打印的結(jié)果
那么為什么會(huì)這樣呢?
其實(shí),其實(shí)&arr和arr,雖然值是一樣的,但是意義應(yīng)該不一樣的。
實(shí)際上: &arr 表示的是數(shù)組的地址,而不是數(shù)組首元素的地址。所以&arr+1其實(shí)是取了整個(gè)數(shù)組的地址并跳過(guò)了整個(gè)數(shù)組
數(shù)組的地址+1,跳過(guò)整個(gè)數(shù)組的大小,所以 &arr+1 相對(duì)于 &arr 的差值是40.
數(shù)組指針具體如何使用,用一個(gè)代碼來(lái)具體體現(xiàn)
指針除了上述的一些引用外,最主要的是用于函數(shù)的參數(shù)
數(shù)組參數(shù),指針參數(shù)
一維數(shù)組傳參
以上的形式都是合理定義參數(shù)的方法
二維數(shù)組傳參
一級(jí)指針傳參
二級(jí)指針傳參
我們來(lái)看一下一段代碼
我們可以看,第一次調(diào)用時(shí)傳的時(shí)pc指針的地址,而本身pc這個(gè)變量是(char *)類(lèi)型,所以傳pc的地址,就需要用char **來(lái)接受,而第三次傳參時(shí),因?yàn)閍rr是一個(gè)指針數(shù)組,它每一個(gè)元素存的是一個(gè)指針,但傳它的數(shù)組名,也就是傳首元素的地址,其實(shí)也就是一個(gè)一級(jí)指針,所以傳它的地址也就是傳二級(jí)指針,所以沒(méi)有問(wèn)題。
函數(shù)指針
運(yùn)行結(jié)果為
輸出的是兩個(gè)地址,這兩個(gè)地址是 test 函數(shù)的地址。 那我們的函數(shù)的地址要想保存起來(lái),怎么保存?
我們就可以用函數(shù)指針
首相要存地址,必須是指針,所以pfun1可以,因?yàn)閜fun1先和*結(jié)合再指向一個(gè)函數(shù),函數(shù)無(wú)返回值。
函數(shù)指針數(shù)組
那要把函數(shù)的地址存到一個(gè)數(shù)組中,那這個(gè)數(shù)組就叫函數(shù)指針數(shù)組,那函數(shù)指針的數(shù)組如何定義呢?
首先parr1先和【】結(jié)合,說(shuō)明parr1是數(shù)組,數(shù)組的內(nèi)容是什么呢? 是 int (*)() 類(lèi)型的函數(shù)指針
函數(shù)指針數(shù)組的用途:轉(zhuǎn)移表
指向函數(shù)指針數(shù)組的指針
指向函數(shù)指針數(shù)組的指針是一個(gè) 指針 指針指向一個(gè) 數(shù)組 ,數(shù)組的元素都是 函數(shù)指針 ;
總結(jié)
- 上一篇: 右移函数(字符串,数组)
- 下一篇: 判断一个字符串是否另一个字符串的右移后的