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

C語言數(shù)組超詳細(xì)講解上

 更新時(shí)間:2022年04月13日 18:54:45   作者:初學(xué)C語言者  
數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素

前言

本文主要介紹數(shù)組相關(guān)的內(nèi)容,主要內(nèi)容包括:

  • 一維數(shù)組的創(chuàng)建和初始化
  • 一維數(shù)組的使用
  • 一維數(shù)組在內(nèi)存中的存儲(chǔ)
  • 二維數(shù)組的創(chuàng)建和初始化
  • 二維數(shù)組的使用
  • 二維數(shù)組在內(nèi)存中的存儲(chǔ)
  • 數(shù)組越界
  • 數(shù)組作為函數(shù)參數(shù)

1、一維數(shù)組的創(chuàng)建和初始化

1.1 一維數(shù)組的創(chuàng)建

數(shù)組是一組相同類型元素的集合,數(shù)組的創(chuàng)建方式:

//type_t 是指數(shù)組的元素類型
//const_n 是一個(gè)常量表達(dá)式,用來指定數(shù)組的大小
type_t arr_name [const_n];

//代碼1
int arr1[10];
//代碼2
int count = 10;
int arr2[count];//數(shù)組不要放變量
//代碼3
char arr3[10];
float arr4[1];
double arr5[20];

注:數(shù)組創(chuàng)建,在C99標(biāo)準(zhǔn)之前, [ ] 中要給一個(gè)常量才可以,不能使用變量。在C99標(biāo)準(zhǔn)支持了變長數(shù)組的概念。

1.2 一維數(shù)組的初始化

數(shù)組的初始化是指,在創(chuàng)建數(shù)組的同時(shí)給數(shù)組的內(nèi)容一些合理初始值(初始化)

int arr[10] = {0};
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};//字符串也是通過數(shù)組定義的
char arr5[] = {'a','b','c'};//字符串也是通過數(shù)組定義的
char arr6[] = "abcdef";//字符串也是通過數(shù)組定義的

數(shù)組在創(chuàng)建的時(shí)候如果想不指定數(shù)組的確定的大小就得初始化。數(shù)組的元素個(gè)數(shù)根據(jù)初始化的內(nèi)容來確定。

仔細(xì)對(duì)比下面5個(gè)數(shù)組:

	char arr1[] = "abc";
	char arr2[3] = { 'a','b','c' };
	char arr3[] = { 'a','b','c' };
	char arr4[4] = { 'a','b','c' };
	char arr5[] = { 'a','b','c','\0' };

	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	printf("%s\n", arr4);
	printf("%s\n", arr5);
	printf("\n");
	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	printf("%d\n", sizeof(arr3));
	printf("%d\n", sizeof(arr4));
	printf("%d\n", sizeof(arr5));

對(duì)比下面兩圖可知,字符串以字符 ‘\0’ 為結(jié)尾:

  • arr1 用雙引號(hào)存儲(chǔ)字符串時(shí),末尾有隱藏的 ‘\0’ ,字符串長度為4
  • arr4 規(guī)定了字符串的長度,末尾也有隱藏的 ‘\0’ ,字符串長度為4
  • arr5 規(guī)直接末尾添加了 ‘\0’ ,字符串長度為4
  • arr3 和 arr4都是只有三個(gè)字符,字符串長度為3,但是末尾沒有 ‘\0’ ,字符串沒有結(jié)束,打印出來后面是亂碼的

下面兩圖的結(jié)果能清楚的表示,上面5中定義的區(qū)別,因此,推薦使用數(shù)組arr1的方式定義字符串。

在這里插入圖片描述

在這里插入圖片描述

1.3 一維數(shù)組的使用

對(duì)于數(shù)組的使用我們之前介紹了一個(gè)操作符: [ ] ,下標(biāo)引用操作符。它其實(shí)就數(shù)組訪問的操作符。

int main()
{
	int arr[10] = {0};//數(shù)組的不完全初始化
	//計(jì)算數(shù)組的元素個(gè)數(shù)= 整個(gè)數(shù)組的大小/數(shù)組首元素的大小
	int sz = sizeof(arr)/sizeof(arr[0]);
	//對(duì)數(shù)組內(nèi)容賦值,數(shù)組是使用下標(biāo)來訪問的,下標(biāo)從0開始。所以:
	int i = 0;//做下標(biāo)
	//for(i=0; i<sz; i++)//這樣也行
	for(i=0; i<10; i++)
	{
		arr[i] = i;//給數(shù)組元素初始化
	}
	//輸出數(shù)組的內(nèi)容
	for(i=0; i<10; ++i)
	{
		printf("%d ", arr[i]);//打印數(shù)組
	}
	return 0;
}

數(shù)組是使用下標(biāo)來訪問的,下標(biāo)是從0開始。 數(shù)組的大小可以通過計(jì)算得到的。

1.4 一維數(shù)組在內(nèi)存中的存儲(chǔ)

接下來探討數(shù)組在內(nèi)存中的存儲(chǔ)

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//打印數(shù)組中的每個(gè)元素的地址
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	int* p = &arr[0];//元素首地址
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p++));//地址加1
	}	
	return 0;
}

兩種打印數(shù)組的方式都可以,結(jié)果相同:

在這里插入圖片描述

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//打印數(shù)組中的每個(gè)元素的地址
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = &arr[0];//元素首地址
	for (int  i = 0; i < sz; i++)
	{//打印地址
		printf("&arr[%d]=%p <==> %p\n", i, &arr[i], p++);
	}
	return 0;
}

輸出結(jié)果見下圖,隨著數(shù)組下標(biāo)的增長,元素的地址,也在有規(guī)律的遞增。整形數(shù)組每個(gè)元素占4個(gè)字節(jié),共10個(gè)元素,總共40個(gè)字節(jié)。所以相鄰元素的地址依次遞增4個(gè)字節(jié)。

由此可以得出結(jié)論:數(shù)組在內(nèi)存中是連續(xù)存放的。

在這里插入圖片描述

在這里插入圖片描述

2、二維數(shù)組的創(chuàng)建和初始化

2.1 二維數(shù)組的創(chuàng)建

//數(shù)組創(chuàng)建
int arr[3][4];
char arr[3][5];
double arr[2][4];

2.2 二維數(shù)組的初始化

//數(shù)組初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二維數(shù)組如果有初始化,行可以省略,列不能省略
int arr1[][5] = { 1,2,3,4,5,6 };//不完全初始化
int arr2[][5] = { {1,2},{3,4},{5,6} };
char ch[5][7];
int arr[4][5] = { 0 };

2.3 二維數(shù)組的使用

二維數(shù)組的使用也是通過下標(biāo)的方式

int main()
{
	int arr2[][5] = { {1,2},{3,4},{5,6} };

	for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++)//打印二維數(shù)組
	{
		//int j = 0;
		for (int j = 0; j < sizeof(arr2[0]) / sizeof(arr2[0][0]); j++)
		{
			printf("%d ", arr2[i][j]);
		}
		printf("\n");
	}
	return 0;
}

在這里插入圖片描述

2.4 二維數(shù)組在內(nèi)存中的存儲(chǔ)

像一維數(shù)組一樣,打印二維數(shù)組的每個(gè)元素

int main()
{
	int arr[3][5] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++)
	{
		int j = 0;
		for ( j = 0; j < 5; j++)
		{
			printf("&arr[%d]{%d]=%p\n", i, j, &arr[i][j]);//地址是連續(xù)的
		}
	}
	return 0;
}

二維數(shù)組的地址在內(nèi)存中也是連續(xù)的,相鄰元素依次相差4個(gè)字節(jié),&arr[0][3]與&arr[1][0]是相連的。

在這里插入圖片描述

在這里插入圖片描述

3、數(shù)組越界

  • 數(shù)組的下標(biāo)是有范圍限制的
  • 數(shù)組的下規(guī)定是從0開始的,如果數(shù)組有n個(gè)元素,最后一個(gè)元素的下標(biāo)就是n-1。所以數(shù)組的下標(biāo)如果小于0,或者大于n-1,就是數(shù)組越界訪問了,超出了數(shù)組合法空間的訪問
  • C語言本身是不做數(shù)組下標(biāo)的越界檢查,編譯器也不一定報(bào)錯(cuò),但是編譯器不報(bào)錯(cuò),并不意味著程序就是正確的,所以程序員寫代碼時(shí),最好自己做越界的檢查
  • 二維數(shù)組的行和列也可能存在越界。
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<=10; i++)
{
printf("%d\n", arr[i]);//當(dāng)i等于10的時(shí)候,越界訪問了
}
return 0;
}

4、數(shù)組作為函數(shù)參數(shù)

往往我們?cè)趯懘a的時(shí)候,會(huì)將數(shù)組作為參數(shù)傳個(gè)函數(shù),比如:要實(shí)現(xiàn)一個(gè)冒泡排序函數(shù),將一個(gè)整形數(shù)組排序

4.1 冒泡排序函數(shù)的錯(cuò)誤設(shè)計(jì)

//方法1:
void bubble_sort(int arr[])//接受數(shù)組
{//計(jì)算數(shù)組的長度
	int sz = sizeof(arr)/sizeof(arr[0]);
	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 = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = {3,1,7,5,8,9,0,2,4,6};
	bubble_sort(arr);//將數(shù)組作為參數(shù)傳遞
	for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

結(jié)果見下圖,沒有達(dá)到預(yù)期的排序效果。

在這里插入圖片描述

按下F10進(jìn)入調(diào)試界面,按F11進(jìn)行單步調(diào)試,會(huì)發(fā)現(xiàn)主函數(shù)中的數(shù)組是10個(gè)元素,這是自己定義的,沒有問題。

在這里插入圖片描述

但是將數(shù)組當(dāng)作參數(shù)傳遞給函數(shù)bubble_sort會(huì)發(fā)現(xiàn),函數(shù)接受的數(shù)組只包含首元素3。

在這里插入圖片描述

因此計(jì)算數(shù)組長度sizeof(arr)時(shí),結(jié)果長度是4,不再是原來主函數(shù)里的40了。

在這里插入圖片描述

調(diào)試之后可以看到 bubble_sort 函數(shù)內(nèi)部的 sz ,是1。

所以數(shù)組作為函數(shù)參數(shù)的時(shí)候,不是把整個(gè)數(shù)組的傳遞過去。

這種情況之前在C語言函數(shù)超詳細(xì)講解上篇中 4.3.3 二分查找中就具體分析過。

4.2 數(shù)組名是什么?

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%p\n", arr);//首元素的地址
	printf("%p\n", arr+1);//+1指向第二個(gè)元素

	printf("%p\n", &arr[0]);//首元素的地址
	printf("%p\n", &arr[0]+1);+1//指向第二個(gè)元素

	printf("%p\n", &arr);//整個(gè)數(shù)組的地址
	printf("%p\n", &arr+1);

	return 0;
}

運(yùn)行結(jié)果見下圖:

  • 數(shù)組名就是首元素的地址,用指針接收
  • 對(duì)數(shù)組名求地址,是整個(gè)數(shù)組的地址
  • &arr的地址和 &arr+1 的地址相差28,這是16進(jìn)制,轉(zhuǎn)化為2進(jìn)制就是 40了,這正是數(shù)組的長度,包含10個(gè)元素

在這里插入圖片描述

在這里插入圖片描述

4.3 對(duì)數(shù)組名的用法進(jìn)行總結(jié)

  • sizeof(數(shù)組名),計(jì)算整個(gè)數(shù)組的大小,sizeof內(nèi)部單獨(dú)放一個(gè)數(shù)組名,數(shù)組名表示整個(gè)數(shù)組。
  • &數(shù)組名,取出的是數(shù)組的地址。&數(shù)組名,數(shù)組名表示整個(gè)數(shù)組。
  • 除此1,2兩種情況之外,所有的數(shù)組名都表示數(shù)組首元素的地址。

4.4 冒泡排序函數(shù)的正確設(shè)計(jì)

上述代碼當(dāng)數(shù)組傳參的時(shí)候,實(shí)際上只是把數(shù)組的首元素的地址傳遞過去了。

所以即使在函數(shù)參數(shù)部分寫成數(shù)組的形式: int arr[] 表示的依然是一個(gè)指針: int *arr 。因?yàn)榈刂房梢杂弥羔樉褪铡?/p>

那么,函數(shù)內(nèi)部的 sizeof(arr) 結(jié)果是4。數(shù)組長度應(yīng)該放在主函數(shù)中進(jìn)行計(jì)算。

下面對(duì)4.2 進(jìn)行改進(jìn),有時(shí)候數(shù)組元素本身就是按一定順序排好的,只需第一輪判斷即可:

void bubble_sort(int* arr, int sz)
{
	//排序坐外面的大循環(huán)次數(shù)
	int i = 0;
	for ( i = 0; i < sz-1; i++)
	{
		int flag = 1;//狀態(tài)機(jī)標(biāo)志位,代表數(shù)組本身元素就是從小到大排序的
		int j = 0;
		for ( j = 0; j < sz-1-i; j++)
		{
			if (arr[j]>arr[j+1])
			{
				flag = 0;//只要有一個(gè)地方需要排序,就置零
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (1==flag)
		{//第一輪排序結(jié)果都是1,說明沒有地方需要排序
			break;//直接跳出后面的循環(huán),不需要再排序了
		}
	}
}
int main()
{
	//int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr[] = { 3,1,2,4,5,6,8,9,7,10 };
	//寫一個(gè)冒泡排序的函數(shù),
	//arr表示首元素的地址, &arr[0],也是首元素的地址
	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;
}

在這里插入圖片描述

總結(jié)

本文是對(duì)數(shù)組相關(guān)知識(shí)點(diǎn)的學(xué)習(xí),下一篇將通過完成三子棋游戲鞏固前面所學(xué)的知識(shí)點(diǎn)。

到此這篇關(guān)于C語言數(shù)組超詳細(xì)講解上的文章就介紹到這了,更多相關(guān)C語言 數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt利用ImageWatch實(shí)現(xiàn)圖片查看功能

    Qt利用ImageWatch實(shí)現(xiàn)圖片查看功能

    Visual Studio有專門針對(duì)OpenCV開發(fā)的插件,名叫ImageWatch,圖片放大之后可以查看RGB的像素值。本文將利用這一查件實(shí)現(xiàn)圖片查看功能,需要的可以參考一下
    2022-04-04
  • C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)實(shí)例

    C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)實(shí)例

    本篇文章主要介紹了C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++學(xué)習(xí)進(jìn)階篇之類大小計(jì)算和this指針

    C++學(xué)習(xí)進(jìn)階篇之類大小計(jì)算和this指針

    this是C++中的一個(gè)關(guān)鍵字,也是一個(gè)const指針,它指向當(dāng)前對(duì)象,通過它可以訪問當(dāng)前對(duì)象的所有成員,下面這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進(jìn)階篇之類大小計(jì)算和this指針的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • C++中的數(shù)字轉(zhuǎn)字符串to_string

    C++中的數(shù)字轉(zhuǎn)字符串to_string

    這篇文章主要介紹了C++中的數(shù)字轉(zhuǎn)字符串to_string,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++vector自定義大小方式

    C++vector自定義大小方式

    這篇文章主要介紹了C++vector自定義大小方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • C++堆排序算法實(shí)例詳解

    C++堆排序算法實(shí)例詳解

    這篇文章主要介紹了C++堆排序算法,簡單分析了堆排序算法的原理并結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)堆排序的具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • C++中輸入輸出流及文件流操作總結(jié)

    C++中輸入輸出流及文件流操作總結(jié)

    這篇文章主要為大家總結(jié)了C++中輸入輸出流及文件流操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C++ STL中常見的算法使用方式

    C++ STL中常見的算法使用方式

    這篇文章主要介紹了C++ STL中常見的算法使用方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 源碼分析C++是如何實(shí)現(xiàn)string的

    源碼分析C++是如何實(shí)現(xiàn)string的

    我們平時(shí)使用C++開發(fā)過程中或多或少都會(huì)使用std::string,但您了解string具體是如何實(shí)現(xiàn)的嗎,本文小編就帶大家從源碼角度分析一下
    2023-04-04
  • C語言中pthread_exit和pehread_join的使用

    C語言中pthread_exit和pehread_join的使用

    pthread_exit用于強(qiáng)制退出一個(gè)線程,pthread_join用于阻塞等待線程退出,獲取線程退出狀態(tài),本文主要介紹了C語言中pthread_exit和pehread_join函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論

镇安县| 江都市| 德清县| 南华县| 宜宾市| 保山市| 开平市| 同仁县| 嵩明县| 公主岭市| 临猗县| 襄樊市| 石屏县| 平度市| 凉城县| 深州市| 凤阳县| 炉霍县| 宁安市| 冷水江市| 彭水| 黄浦区| 江津市| 崇信县| 鸡东县| 包头市| 文水县| 全椒县| 永吉县| 准格尔旗| 阳曲县| 大新县| 新龙县| 南通市| 横峰县| 昌乐县| 嘉义市| 泰来县| 广灵县| 上思县| 屏东县|