国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言基礎(chǔ)】:深入理解指針(三)

這篇具有很好參考價值的文章主要介紹了【C語言基礎(chǔ)】:深入理解指針(三)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

深入理解指針

指針系列回顧
【C語言基礎(chǔ)】:深入理解指針(一)
【C語言基礎(chǔ)】:深入理解指針(二)

一、冒泡排序

冒泡排序的核心思想就是:兩兩相鄰的元素進(jìn)行比較。

#include<stdio.h>

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = 0;
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

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

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
可以看到,這段代碼對arr數(shù)組進(jìn)行了排序,但這個代碼還有一些缺陷,那就是無論數(shù)組內(nèi)部的元素是否有序,他都會循環(huán)9次,這樣肯定是不合理的,要進(jìn)行優(yōu)化一下。

我們在bubble_sort函數(shù)的第一層循環(huán)里面定義一個變量flag,進(jìn)入第二層循環(huán)就修改flag的值,第二層循環(huán)結(jié)束時給變量flag來個判斷,如果變量flag沒有發(fā)生改變,說明沒有進(jìn)入第二層循環(huán),也就是說這時數(shù)組里的元素是有序的,就會直接跳出第一層循環(huán)。另外,我們還可以在最外面定義一個全局變量用來計數(shù),每進(jìn)行一次元素交換就會自增1。

#include<stdio.h>
int count = 0;
bubble_sort(int arr[], int sz)  //參數(shù)接收數(shù)組元素個數(shù)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;  //假設(shè)這?趟已經(jīng)有序了
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			count++;
			if (arr[j] > arr[j + 1])
			{
				flag = 0;  //發(fā)?交換就說明,?序
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 1)  //這?趟沒交換就說明已經(jīng)有序,后續(xù)?序排序了
			break;
	}
}

int main()
{
	int arr[] = { 0,9,8,6,5,3,1,2,4,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);  // 求出數(shù)組中的元素個數(shù)
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("%d\n", count);
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
運(yùn)行之后可以發(fā)現(xiàn),代碼的運(yùn)行效率明顯提升了,理論來說上述數(shù)組元素在未優(yōu)化的代碼下運(yùn)行是要進(jìn)行45次交換的,現(xiàn)在明顯次數(shù)減少了。

二、二級指針

通過前面的知識我們知道,指針變量也是一個變量,只要是一個變量就會有地址,那么,指針變量的地址放在哪里呢?
我們把存放地址的指針稱為二級指針,也就是指針的指針

#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	return 0;
}

而三級指針就是存放二級指針變量的地址,四級指針、五級指針以此類推…

對于二級指針的運(yùn)算有:

  • *ppa通過對ppa進(jìn)行解引用,就可以找到pa,*ppa其實訪問的就是pa。
int b = 20;
*ppa = &b;  // 等價于pa = &b
  • **pa先通過*ppa找到pa,然后對pa進(jìn)行解引用操作:*pa,找到的就是a。
**ppa = 30;
//等價于*pa = 30;
//等價于a = 30;

三、指針數(shù)組

首先我們要弄懂一個問題:指針數(shù)組到底是一個指針還是一個數(shù)組?
這里我們可以類比一下:

整數(shù)數(shù)組:就是一個存放整型的數(shù)組
字符數(shù)組:就是一個存放字符的數(shù)組。

那指針數(shù)組呢?沒錯,就是存放指針的數(shù)組。
【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
指針數(shù)組里的每個元素都是用來存放地址(指針)的。

如下圖:
【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
通過這張圖可以看到,指針數(shù)組里的每一個元素都是一個指針,而這里面的每一個指針又可以指向一塊區(qū)域。

3.1 指針數(shù)組模擬二維數(shù)組
#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	//數(shù)組名是數(shù)組首元素的地址,類型是int*的,就可以存放在parr數(shù)組中
	int* parr[] = { arr1, arr2, arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
parr[i]是訪問parr數(shù)組的元素,parr[i]找到的數(shù)組元素指向了整型?維數(shù)組,parr[i][j]就是整型?維數(shù)組中的元素。
注意:這只是利用指針數(shù)組模擬的二維數(shù)組,并非是真的二維數(shù)組,因為每一行的地址并非連續(xù)的。

四、字符指針變量

在指針的類型中我們知道有一種指針類型為字輔指針char*
一般使用:

#include<stdio.h>
int main()
{
	char ch = 'w';
	char* pc = &ch;
	*pc = 'w';
	return 0;
}

還有一種使用方式如下:

#include<stdio.h>
int main()
{
	const char* pc = "hello world";
	printf("%s\n", pc);//這里是把一個字符串放到pc指針變量里了嗎?
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
注意:這里const char* pc = “hello world”; 特別容易讓人認(rèn)為是把字符串hello world放到字符指針pc里了,但其實本質(zhì)上是字符串hello world 首字符的地址放到了pc中。
【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
上面的代碼的意思是把一個常量字符串的首字符h的地址存放到指針變量pc中。

下面是一道和字符串相關(guān)的題,我們可以學(xué)一下:

#include<stdio.h>
int main()
{
	char str1[] = "hello world";
	char str2[] = "hello world";
	const char* str3 = "hello world";
	const char* str4 = "hello world";
	if (str1 == str2)
		printf("str1 and str2 are same\n");  // 序號1
	else
		printf("str1 and str2 are not same\n");  // 序號2
	if (str3 == str4)
		printf("str3 and str4 are same\n");  // 序號3
	else
		printf("str3 and str4 are not same\n");  // 序號4
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
運(yùn)行之后我們會發(fā)現(xiàn),打印的是序號2和序號3的語句,這是為什么呢?
這里的str3和str4指向的是同一個常量字符串。C/C++會把常量字符串存儲到一個單獨的內(nèi)存區(qū)域,當(dāng)幾個指針指向同一個字符串的時候,它們實際會指向同一塊內(nèi)存。但是用相同的常量字符串去初始化不同的數(shù)組的時候就會開辟出不同的內(nèi)存塊。所以str1和str2不同,str3和str4相同。

五、數(shù)組指針變量

5.1 數(shù)組指針變量是什么?

上面在學(xué)指針數(shù)組的時候我們知道,指針數(shù)組是數(shù)組元素為指針的數(shù)組。那么數(shù)組指針是什么呢?
上面學(xué)習(xí)指針數(shù)組的時候類比了一下,那么這里不妨也來類比一下:

  • 整型指針變量int * pint; 存放的是整型變量的地址,能夠指向整形數(shù)據(jù)的指針。
  • 浮點型指針變量float * pf; 存放浮點型變量的地址,能夠指向浮點型數(shù)據(jù)的指針。

那么數(shù)組指針就是存放數(shù)組的地址,能夠指向數(shù)組數(shù)據(jù)的指針變量。

我們判斷一下下面那個是數(shù)組指針

int *p1[10];
int (*p2)[10];

int * p1[10]; 是一個指針數(shù)組,是 10 個整型指針的數(shù)組。
int ( * p2)[10]; 是數(shù)組指針,表示一個指向包含 10 個整型數(shù)據(jù)的數(shù)組的指針。因為 p2 是一個指針,所以 p2 是一個指針類型。

數(shù)組指針變量

int (*p2)[10];

這里p會先和 * 號結(jié)合,說明p是一個指針變量,然后指向的是一個大小為10個整型數(shù)據(jù)大小的數(shù)組,所以p是一個指針,指向一個數(shù)組,叫數(shù)組指針。
注意:[]的優(yōu)先級是高于 * 號的,所以必須要加上()來保證 p會先和 * 結(jié)合。

5.2 數(shù)組指針變量的初始化

數(shù)組指針變量是用來存放數(shù)組地址的,那怎么獲得數(shù)組的地址呢?其實就是我們之前學(xué)的 &數(shù)組名。

int main()
{
	int arr[10] = { 0 };
	&arr;  //得到的就是數(shù)組的地址
	return 0;
}

如果要存放個數(shù)組的地址,就得存放在數(shù)組指針變量中,如下:

int main()
{
	int arr[10] = { 0 };
	int(*pa)[10] = &arr;
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
在調(diào)試的過程中我們也可以看到 &arrpa的類型是完全一致的。

數(shù)組指針類型解析:

int (*p) [10] = &arr;
 |    |    |
 |    |    |
 |    |    | p指向數(shù)組的元素個數(shù)
 |    p是數(shù)組指針變量名
 p指向的數(shù)組的元素類型

六、二維數(shù)組傳參的本質(zhì)

有了數(shù)組指針的理解,我們就能夠講?下二維數(shù)組傳參的本質(zhì)了。
過去我們有一個二維數(shù)組的需要傳參給?個函數(shù)的時候,我們是這樣寫的:

#include<stdio.h>

void test(int a[3][5], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf("%d ", a[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} };
	test(arr, 3, 5);
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
這里實參是二維數(shù)組,形參也寫成?維數(shù)組的形式,那還有什么其他的寫法嗎?
首先我們再次理解?下二維數(shù)組,二維數(shù)組其實可以看做是每個元素是?維數(shù)組的數(shù)組,也就是?維數(shù)組的每個元素是?個?維數(shù)組。那么?維數(shù)組的首元素就是第一行,是個?維數(shù)組。
如下圖:
【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
所以,根據(jù)數(shù)組名是數(shù)組首元素的地址這個規(guī)則,?維數(shù)組的數(shù)組名表示的就是第一行的地址,是?維數(shù)組的地址。根據(jù)上面的例子,第一行的?維數(shù)組的類型就是 int [5] ,所以第一行的地址的類型就是數(shù)組指針類型 int(*)[5] 。那就意味著?維數(shù)組傳參本質(zhì)上也是傳遞了地址,傳遞的是第一行這個?維數(shù)組的地址,那么形參也是可以寫成指針形式的。如下:

#include<stdio.h>

void test(int(*p)[5], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf("%d ", *((*p + 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} };
	test(arr, 3, 5);
	return 0;
}

【C語言基礎(chǔ)】:深入理解指針(三),c語言,開發(fā)語言
總結(jié):二維數(shù)組傳參,形參的部分可以寫成數(shù)組,也可以寫成指針形式。文章來源地址http://www.zghlxwxcb.cn/news/detail-838292.html

到了這里,關(guān)于【C語言基礎(chǔ)】:深入理解指針(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C語言指針基礎(chǔ)

    C語言指針基礎(chǔ)

    目錄 前言 本期介紹內(nèi)容: 一、指針是什么? 二、指針和指針類型 指針類型的意義: 三、野指針 3.1什么是野指針? 3.2野指針的成因 1.指針未初始化 2.指針越界訪問 3.指針指向的那塊空間已經(jīng)釋放(還給操作系統(tǒng)了) 3.3如何規(guī)避野指針 四、指針運(yùn)算 4.1指針加減整數(shù) 4.2指針

    2024年02月12日
    瀏覽(24)
  • C語言基礎(chǔ)之——指針(上)

    C語言基礎(chǔ)之——指針(上)

    前言:小伙伴們又見面啦!本期內(nèi)容,博主將展開講解有關(guān)C語言中指針的上半部分基礎(chǔ)知識,一起學(xué)習(xí)起來叭!??! 目錄 一.什么是指針 二.指針類型 1.指針的解引用 2.指針+-整數(shù) 三.野指針 1.野指針成因 (1)指針未初始化 ?(2)指針越界訪問 2.如何規(guī)避野指針 四.總結(jié) 指針

    2024年02月11日
    瀏覽(25)
  • C語言基礎(chǔ)之——指針(下)

    C語言基礎(chǔ)之——指針(下)

    前言:本篇文章將繼續(xù)講解有關(guān)指針的剩余基礎(chǔ)知識。 學(xué)無止境,一起加油叭??! 目錄 一.指針運(yùn)算 1.指針 +- 整數(shù) ?2.指針的關(guān)系運(yùn)算 ?3.指針 - 指針 二.指針與數(shù)組 三.二級指針 四.指針數(shù)組 總結(jié) 指針運(yùn)算包括以下三種: 指針 +- 整數(shù) 指針 - 指針 指針的關(guān)系運(yùn)算 我們嘗試用

    2024年02月11日
    瀏覽(25)
  • 【C語言基礎(chǔ)入門】二級指針、一維數(shù)組與指針、二維數(shù)組與指針

    【C語言基礎(chǔ)入門】二級指針、一維數(shù)組與指針、二維數(shù)組與指針

    在學(xué)習(xí)C語言的過程中,理解指針的概念是非常重要的。指針提供了一種直接訪問內(nèi)存地址的方式,使得我們可以更加靈活地管理數(shù)據(jù)和內(nèi)存。在本文中,我們將介紹C語言中的二級指針、一維數(shù)組與指針,并通過通俗易懂的語言和示例代碼來幫助讀者理解這些概念。 二級指針

    2024年02月05日
    瀏覽(29)
  • C語言-基礎(chǔ)語法學(xué)習(xí)-3 二級指針

    C語言-基礎(chǔ)語法學(xué)習(xí)-3 二級指針

    當(dāng)涉及到多級指針時,C語言的靈活性和強(qiáng)大的指針功能可以得到充分的發(fā)揮。二級指針是指指向指針的指針,也被稱為指向指針的引用。 使用二級指針可以實現(xiàn)以下功能: 動態(tài)內(nèi)存分配:通過二級指針可以動態(tài)地分配內(nèi)存塊,并將其地址傳遞給其他函數(shù)或模塊進(jìn)行操作。這

    2024年02月12日
    瀏覽(24)
  • C語言 指針聲明和定義 - C語言零基礎(chǔ)入門教程

    目錄 [一.指針簡介] [1.內(nèi)存] [2.內(nèi)存地址] [3.指針聲明] [二.指針類型] [三.聲明并初始化一個指針] [1.聲明指針并直接初始化 – 推薦] [2.先聲明指針在初始化 – 不推薦] [四.查看指針地址和指針的值] [五.NULL 指針 – 空指針] [六.重點總結(jié)] [七.猜你喜歡] 零基礎(chǔ) C/C++ 學(xué)習(xí)路線推薦

    2024年03月22日
    瀏覽(44)
  • 【05】STM32·HAL庫開發(fā)-C語言基礎(chǔ)知識 | stdint.h介紹 | 位操作 | 宏定義的使用 | 條件編譯 | extern聲明 | typdef使用 | 結(jié)構(gòu)體、指針、代碼規(guī)范介紹。

    【05】STM32·HAL庫開發(fā)-C語言基礎(chǔ)知識 | stdint.h介紹 | 位操作 | 宏定義的使用 | 條件編譯 | extern聲明 | typdef使用 | 結(jié)構(gòu)體、指針、代碼規(guī)范介紹。

    ??stdint.h 是從 C99 中引進(jìn)的一個標(biāo)準(zhǔn) C 庫的文件,可以在MDK5的安裝路徑:D:MDK5.34ARMARMCCinclude中找到。 ??stdint.h 定義了很多類型別名,將有符號的char類型定義別名為int8_t等,使用此套別名有易于移植。 ??在MDK中需要配置才能支持使用S99標(biāo)準(zhǔn), 默認(rèn)是勾選的 。 ??只

    2024年02月08日
    瀏覽(18)
  • 逍遙自在學(xué)C語言 | 指針的基礎(chǔ)用法

    逍遙自在學(xué)C語言 | 指針的基礎(chǔ)用法

    在C語言中,指針是一項重要的概念,它允許我們直接訪問和操作內(nèi)存地址。 可以說,指針是C語言一大優(yōu)勢。用得好,你寫程序如同趙子龍百萬軍中取上將首級;用得不好,則各種問題層出不窮,有種雙拳難敵四手的感覺。 本文將介紹指針的基礎(chǔ)知識,包括指針的定義、初始

    2024年02月09日
    瀏覽(32)
  • 【C語言初階】帶你輕松掌握指針基礎(chǔ)知識完結(jié)篇——野指針,指針運(yùn)算,指針和數(shù)組,二級指針

    【C語言初階】帶你輕松掌握指針基礎(chǔ)知識完結(jié)篇——野指針,指針運(yùn)算,指針和數(shù)組,二級指針

    君兮_的個人主頁 勤時當(dāng)勉勵 歲月不待人 C/C++ 游戲開發(fā) Hello,這里是君兮_,今天繼續(xù)給大家更新0基礎(chǔ)入門C語言的內(nèi)容,我們這次主要更新的依然是初階指針的基礎(chǔ)知識 廢話不多說咱們直接開始吧?。?概念: 野指針就是指針指向的位置是不可知的(隨機(jī)的、不正確的、沒有

    2024年02月16日
    瀏覽(22)
  • 【C語言】指針超級無敵金剛霹靂進(jìn)階(但不難,還是基礎(chǔ))

    【C語言】指針超級無敵金剛霹靂進(jìn)階(但不難,還是基礎(chǔ))

    點擊這里訪問我的博客主頁~~ 對指針概念還不太清楚的點擊這里訪問上一篇指針初階2.0 上上篇指針初階1.0 謝謝各位大佬的支持咯 今天我們一起來學(xué)習(xí)指針進(jìn)階內(nèi)容 指針變量有 字符指針變量 , 數(shù)組指針變量 和 函數(shù)指針變量 char* 叫做字符指針 一般這么來使用: 通過指針存

    2024年03月09日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包