最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言進階:指針的進階(2)

 更新時間:2021年09月02日 14:33:29   作者:AKA你的閨蜜  
這篇文章主要介紹了C語言指針詳解及用法示例,介紹了其相關概念,然后分享了幾種用法,具有一定參考價值。需要的朋友可以了解下

數(shù)組指針

由前面的例子,不難得出,數(shù)組指針是指向數(shù)組的指針,是指針而非數(shù)組。

數(shù)組指針的定義

char ch = 'w';
char* pch = &ch;//字符地址存放在字符指針中
int a = 10;
int* pint = &a;//整型地址存放在整型指針中
float f = 0.0;
float* pf = &f;//浮點型地址存放在浮點型指針中

什么變量的地址存放在什么指針中。指針指向變量的類型,決定了指針的類型。顧名思義,數(shù)組指針指向的是數(shù)組。

遞推可得,數(shù)組的地址存放在數(shù)組指針中。且數(shù)組指針的類型為數(shù)組的類型再加個* 。

下面那種定義方法是對的呢?

int arr[10] = { 0 };
//1.
int* pa = arr;
//2.
&arr;//整個數(shù)組的地址
int* parr = &arr;
//3.
int* parr[10] = &arr;
//4.
int(*parr)[10] = &arr;

取出的是首元素的地址,而非整個數(shù)組的地址
整型指針應存放整型變量的地址,數(shù)組的地址無法存入整型指針中。
[]的優(yōu)先級比*高,故parr先與[]結合成數(shù)組名,所以parr是個指針數(shù)組。

數(shù)組指針的類型由數(shù)組類型決定,先找出數(shù)組的類型int[10](去掉名就是類型)。且不能讓[]先與parr結合,所以用()先將parr和*結合,即成int(*parr)[10]。

C語言規(guī)定[]必須再最后面,所以不可寫成int[10](*parr)。

int* parr[10];//指針數(shù)組
int(*parr)[10];//數(shù)組指針

我們前面強調過,去掉名字就是類型。所以int[10]是整型數(shù)組的類型,int*[10]是指針數(shù)組的類型,int(*)[10]是數(shù)組指針的類型。

&數(shù)組名和數(shù)組名

之前介紹過不止一遍,所以這次只說重點。

指針類型決定了指針±整數(shù)的步長。

//首元素地址+1
printf("%p\n", arr);//0073FCA4
printf("%p\n", arr + 1);//0073FCA8
//整個數(shù)組地址+1
printf("%p\n", &arr);//0073FCA4
printf("%p\n", &arr + 1);//0073FCCC

1.首元素地址就是整型指針+1,自然只能向后訪問4shou個字節(jié)

2.整個數(shù)組地址+1,即int(*)[10]型指針+1,向后訪問了 i n t × 10 int×10 int×10即40個字節(jié)。

sizeof(arr)也代表整個數(shù)組,現(xiàn)在去理解為什么sizeof里數(shù)組名代表的是整個數(shù)組呢?數(shù)組這種結構保存了數(shù)組的大小,sizeof求所占空間的長度,那自然要嚴謹一些了。

數(shù)組指針的使用

遍歷數(shù)組,使用數(shù)組或是指針作形參接收就行了。且所謂的用數(shù)組接收僅是理解層面,本質上都是指針。

void Print1(int arr[], int sz) {
	for (int i = 0; i < sz; i++) {
		//printf("%d ", arr[i]); 
		printf("%d ", *(arr + i));		
	}
}
void Print2(int* arr, int sz) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
		//printf("%d ", *(arr + i));
	}
}
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Print1(arr, sz);
	Print2(arr, sz);
	return 0;
}

反面用例

數(shù)組作實參,用數(shù)組或指針接收即可。數(shù)組指針使用對了很好用,但如果隨便用可能會很別扭。下面先介紹強行使用數(shù)組指針的用法。

//錯誤示范
void Print3(int(*pa)[10], int sz) {
	for (int i = 0; i < sz; i++) {
		//printf("%d ", pa[i]);
		printf("%d ", *(pa + i));
	}
}

將整個數(shù)組地址傳過去,則用數(shù)組指針接收,然后呢,直接對pa解引用嗎?

在這里插入圖片描述

結果顯然是錯誤的,從結果中也可以看出打印的是十進制下的地址,+1跳過40個字節(jié)。

這里筆者在學習的時候產(chǎn)生了個疑問,傳過去數(shù)組的地址,為什么解一層引用后還是地址呢?

&arr解引用*后相當于找到首元素的地址,可以理解為&和*相互抵消只剩下arr不就是首元素的地址嘛~

void Print4(int(*pa)[10], int sz) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", *(*(pa)+j));
	}
}

倘若我們把一維數(shù)組看作是二維數(shù)組第一行。由于二維數(shù)組在內存中是連續(xù)存放的,我們只打印二維數(shù)組的第一行,便可以避免上面的錯誤。

在這里插入圖片描述

style=“zoom:80%;” />

*(pa)相當于數(shù)組指針所指向數(shù)組的數(shù)組名。數(shù)組指針指向整個數(shù)組,將其看作二維數(shù)組并解引用得到一行的首元素,從而遍歷訪問。

正面用例

從上面的例子也可以看出,用數(shù)組指針訪問二維數(shù)組時,效果便不錯。

//二維數(shù)組傳參,用二維數(shù)組接收
void Print1(int arr[3][5], int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			//printf("%d ", arr[i][j]);
			printf("%d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
}

上面的例子,是正常二維數(shù)組傳參,二維數(shù)組接收的情況。下面我們用數(shù)組指針接收。

//二維數(shù)組傳參,用數(shù)組指針接收
void Print2(int(*pa)[5], int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
            //1.
            printf("%d ", pa[i][j]);
            //2.
			printf("%d ", *(*(pa + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	Print2(arr, 3, 5);//二維數(shù)組首元素是首行    
	return 0;
}
  • 把二維數(shù)組想象成一個擁有三個元素的一維數(shù)組(每個元素也為一維數(shù)組),即一維數(shù)組的一維數(shù)組。
  • 由于其每個元素是有5個元素的一維數(shù)組,數(shù)組指針定義為int(*p)[5],指向首行這個“一維數(shù)組”。(傳參穿的是數(shù)組名)
  • 第一層循環(huán)用于“跳行”,即每次跳過5個元素。第二層循環(huán)遍歷每行“一維數(shù)組”。

在這里插入圖片描述

用二維數(shù)組和數(shù)組指針接收的都是首行地址。
數(shù)組指針的類型int(*)[5],和二維數(shù)組首元素地址的類型相同。

故可得,二維數(shù)組首元素地址和數(shù)組指針是等價的,即數(shù)組指針pa就是數(shù)組名。

二維數(shù)組首元素為其首行,相當于一個一維數(shù)組,該一維數(shù)組的地址類型為int(*)[5]。且實參為二維數(shù)組名,降級為指向首行的指針,所以它是數(shù)組指針,類型為int(*)[5]。

數(shù)組指針指向二維數(shù)組,才是使用數(shù)組指針的正確示范。

Example

下列示例分別是什么?

//1.
int arr[5];
//2.
int *pa1[5];
//3.
int (*pa2)[10];
//4.
int (*pa3[10])[5];

1.整型數(shù)組

2.存放整型指針的數(shù)組

*靠左靠右無所謂,pa1先和[]結合為數(shù)組,剩下int*為數(shù)組元素類型。

3.指向整型數(shù)組的指針

(*pa2),*先和pa2結合為指針,剩下int[10],指向的是元素個數(shù)為10的整型數(shù)組。

4.存放數(shù)組指針的數(shù)組

pa3先和[10]結合為數(shù)組,剩下int(*)[5]是指向數(shù)組的指針為數(shù)組的元素。所以是個元素個數(shù)為10的數(shù)組指針數(shù)組。

逆向思考,有整型數(shù)組arr[5]和指向該數(shù)組的類型為int(*)[5]的數(shù)組指針,還有數(shù)組指針數(shù)組pa3[10]用于存放該數(shù)組指針。

在這里插入圖片描述

類型辨別方法

1.若名稱先和[]結合為數(shù)組,只去掉數(shù)組名就是數(shù)組類型,去掉[n]和數(shù)組名便是其元素的類型。

2.若名稱先和*結合為指針,只去掉指針名就是指針類型,去掉*和指針名便是指向的變量的類型。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • C++中stack的pop()函數(shù)返回值解析

    C++中stack的pop()函數(shù)返回值解析

    這篇文章主要介紹了C++中stack的pop()函數(shù)返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++多線程傳參的實現(xiàn)方法

    C++多線程傳參的實現(xiàn)方法

    本文主要介紹了C++多線程傳參的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C++詳細講解圖的拓撲排序

    C++詳細講解圖的拓撲排序

    拓撲排序(Topological?Sorting)若一個由圖中所有點構成的序列?A?滿足:對于圖中的每條邊?(x,y),x?在?A?中都出現(xiàn)在?y?之前,則稱?A?是該圖的一個拓撲序列
    2022-05-05
  • C和C++11之enum枚舉的具體使用方法

    C和C++11之enum枚舉的具體使用方法

    這篇文章主要介紹了C和C++11之enum枚舉的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C語言do關鍵字的具體使用

    C語言do關鍵字的具體使用

    本篇文章主要介紹了C語言do關鍵字的具體使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • C++實現(xiàn)大數(shù)乘法算法代碼

    C++實現(xiàn)大數(shù)乘法算法代碼

    這篇文章主要介紹了C++實現(xiàn)大數(shù)乘法算法代碼的相關資料,需要的朋友可以參考下
    2015-03-03
  • 看圖深入理解單鏈表的反轉

    看圖深入理解單鏈表的反轉

    今天遇到單向鏈表的反轉的問題,于是靜下心來好好想了一番。下面這篇文章主要給大家介紹了關于單鏈表反轉的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • C語言實現(xiàn)手寫字符串處理工具的示例代碼

    C語言實現(xiàn)手寫字符串處理工具的示例代碼

    這篇文章主要為大家詳細介紹了利用C語言實現(xiàn)手寫字符串處理工具的相關資料,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-09-09
  • 如何統(tǒng)計在一篇文章中某個單詞出現(xiàn)了幾次,以及第一次出現(xiàn)的位置

    如何統(tǒng)計在一篇文章中某個單詞出現(xiàn)了幾次,以及第一次出現(xiàn)的位置

    本文的主要內容就是統(tǒng)計某個單詞在一篇文章中出現(xiàn)了幾次,以及第一次出現(xiàn)的位置,需要的朋友可以參考下
    2015-08-08
  • QT實現(xiàn)定時關閉消息提示框

    QT實現(xiàn)定時關閉消息提示框

    這篇文章主要介紹了軟件利用Qt簡單實現(xiàn)消息提示框可定時自動關閉,文中的示例代碼講解詳細,對我們;了解QT有一定的幫助,感興趣的可以學習一下
    2022-01-01

最新評論

乳山市| 陆丰市| 刚察县| 固阳县| 大方县| 尚志市| 开鲁县| 河西区| 威宁| 宣化县| 石台县| 绥芬河市| 呼和浩特市| 龙门县| 富锦市| 乐平市| 高雄县| 鲜城| 大邑县| 象山县| 景谷| 吐鲁番市| 康保县| 温宿县| 吴川市| 菏泽市| 芦溪县| 万源市| 松滋市| 苍南县| 姚安县| 郧西县| 林芝县| 建昌县| 同德县| 高碑店市| 珠海市| 铜梁县| 阜新| 双牌县| 杭锦后旗|