柚子快報激活碼778899分享:開發(fā)語言 C語言之“ 數(shù)組 ”
柚子快報激活碼778899分享:開發(fā)語言 C語言之“ 數(shù)組 ”
? ? ? ? ? ?個人主頁?:喜歡草莓熊的bear
? ? ? ? ? ? ??專欄?:C語言基礎(chǔ)
目錄
前言
一、數(shù)組
二、一維數(shù)組
2.1 一維數(shù)組的創(chuàng)建和初始化
數(shù)組創(chuàng)建
數(shù)組初始化
數(shù)組類型
2.2 一維數(shù)組的使用
數(shù)組下標(biāo)
數(shù)組打印
數(shù)組輸入
2.3 一維數(shù)組在內(nèi)存中的儲存
三、sizeof計算數(shù)組元素個數(shù)
四、二位數(shù)組
4.1 二維數(shù)組的概念
4.2 二維數(shù)組的創(chuàng)建
4.3 二維數(shù)組的初始化
不完全初始化
完全初始化
按照行初始化
初始化時省略行,但是不能省略列
4.5 二維數(shù)組的使用
4.6 二維數(shù)組的輸入和輸出
4.7?二維數(shù)組的儲存
五、C99中的變長數(shù)組
六、二分查找
總結(jié)
前言
本期給大家介紹的數(shù)組主要內(nèi)容包括:數(shù)組的一些概念、了解一維數(shù)組、二維數(shù)組。
一、數(shù)組
數(shù)組是?組相同類型元素的集合;從這個概念中我們就可以發(fā)現(xiàn)2個有價值的信息:
?
數(shù)組中存放的是1個或者多個數(shù)據(jù),但是數(shù)組元素個數(shù)不能為0。
?
數(shù)組中存放的多個數(shù)據(jù),類型是相同的。
數(shù)組分為?維數(shù)組和多維數(shù)組,多維數(shù)組?般?較多?的是?維數(shù)組。
二、一維數(shù)組
2.1 一維數(shù)組的創(chuàng)建和初始化
數(shù)組創(chuàng)建
語法形式如下:
1 type arr_name[常量值];
?存放在數(shù)組的值被稱為數(shù)組的元素,數(shù)組在創(chuàng)建的時候可以指定數(shù)組的??和數(shù)組的元素類型。
?
type
指定的是數(shù)組中存放數(shù)據(jù)的類型,可以是:
char
、
short
、
int
、
float
等,也可以?
定義的類型
?
arr_name
指的是數(shù)組名的名字,這個名字根據(jù)實際情況,起的有意義就?。
?
[]
中的常量值是?來指定數(shù)組的??的,這個數(shù)組的??是根據(jù)實際的需求指定就?。
?如:我們現(xiàn)在想存儲某個班級的20?的數(shù)學(xué)成績,那我們就可以創(chuàng)建?個數(shù)組,如下:
int math[20];
char ch[8];
double score[10];
數(shù)組初始化
有時候,數(shù)組在創(chuàng)建的時候,我們需要給定?些初始值值,這種就稱為初始化的。
那數(shù)組如何初始化呢?數(shù)組的初始化?般使??括號,將數(shù)據(jù)放在?括號中。
//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第?個元素初始化為1,剩余的元素默認(rèn)初始化為0
//錯誤的初始化 - 初始化項太多
int arr3[3] = {1, 2, 3, 4};
數(shù)組類型
數(shù)組也是有類型的,數(shù)組算是?種?定義類型,去掉數(shù)組名留下的就是數(shù)組的類型。
如下:
int arr1[10];
int arr2[12];
char ch[5];
arr1數(shù)組的類型是 int [10]
arr2數(shù)組的類型是 int[12]
ch 數(shù)組的類型是 char [5]
2.2 一維數(shù)組的使用
學(xué)習(xí)了?維數(shù)組的基本語法,?維數(shù)組可以存放數(shù)據(jù),存放數(shù)據(jù)的?的是對數(shù)據(jù)的操作,那我們?nèi)绾问??維數(shù)組呢?
數(shù)組下標(biāo)
C語?規(guī)定數(shù)組是有下標(biāo)的,下標(biāo)是從0開始的,假設(shè)數(shù)組有n個元素,最后?個元素的下標(biāo)是n-1,下標(biāo)就相當(dāng)于數(shù)組元素的編號,如下:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
在C語?中數(shù)組的訪問提供了?個操作符 [] ,這個操作符叫:下標(biāo)引?操作符。
有了下標(biāo)訪問操作符,我們就可以輕松的訪問到數(shù)組的元素了,?如我們訪問下標(biāo)為7的元素,我們就可以使? arr[7]
,想要訪問下標(biāo)是3的元素,就可以使?
arr[3]
,如下代碼:
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n", arr[7]);//8
printf("%d\n", arr[3]);//4
return 0;
}
執(zhí)行結(jié)果:
數(shù)組打印
接下來,如果想要訪問整個數(shù)組的內(nèi)容,那怎么辦呢?
只要我們產(chǎn)?數(shù)組所有元素的下標(biāo)就可以了,那我們使?for循環(huán)產(chǎn)?0~9的下標(biāo),接下來使?下標(biāo)訪問就?了。
如下代碼:
#include
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 ", arr[i]);
}
return 0;
}
輸出的結(jié)果:
數(shù)組輸入
明?了數(shù)組的訪問,當(dāng)然我們也根據(jù)需求,??給數(shù)組輸?想要的數(shù)據(jù),如下:
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
?
2.3 一維數(shù)組在內(nèi)存中的儲存
有了前?的知識,我們其實使?數(shù)組基本沒有什么障礙了,如果我們要深?了解數(shù)組,我們最好能了解?下數(shù)組在內(nèi)存中的存儲。
依次打印數(shù)組元素的地址:
#include
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("&arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
輸出結(jié)果我們看看:
從輸出的結(jié)果我們分析,數(shù)組隨著下標(biāo)的增?,地址是由?到?變化的,并且我們發(fā)現(xiàn)每兩個相鄰
元素之間相差4(因為?個整型是4個字節(jié))。所以我們得出結(jié)論:數(shù)組在內(nèi)存中是連續(xù)存放的。這就 為后期我們使?指針訪問數(shù)組奠定了基礎(chǔ)(在講指針的時候我們在講,這?暫且記住就?)。
?
三、sizeof計算數(shù)組元素個數(shù)
在遍歷數(shù)組的時候,我們經(jīng)常想知道數(shù)組的元素個數(shù),那C語?中有辦法使?程序計算數(shù)組元素個數(shù)嗎?
答案是有的,可以使?sizeof。
sizeof
中C語?是?個關(guān)鍵字,是可以計算類型或者變量??的,其實
sizeof
也可以計算數(shù)組的
??。
?如:
#include
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}
這?輸出的結(jié)果是40,計算的是數(shù)組所占內(nèi)存空間的總??,單位是字節(jié)。
我們?知道數(shù)組中所有元素的類型都是相同的,那只要計算出?個元素所占字節(jié)的個數(shù),數(shù)組的元素個數(shù)就能算出來。這?我們選擇第?個元素算??就可以。
#include
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr[0]));//計算?個元素的??,單位是字節(jié)
return 0;
}
接下來就能計算出數(shù)組的元素個數(shù):
#include
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
這?的結(jié)果是:10,表?數(shù)組有10個元素。
以后在代碼中需要數(shù)組元素個數(shù)的地?就不?固定寫死了,使?上?的計算,不管數(shù)組怎么變化,計算出的??也就隨著變化了。
四、二位數(shù)組
4.1 二維數(shù)組的概念
前?學(xué)習(xí)的數(shù)組被稱為?維數(shù)組,數(shù)組的元素都是內(nèi)置類型的,如果我們把?維數(shù)組做為數(shù)組的元
素,這時候就是?維數(shù)組,?維數(shù)組作為數(shù)組元素的數(shù)組被稱為三維數(shù)組,?維數(shù)組以上的數(shù)組統(tǒng)稱為多維數(shù)組。
4.2 二維數(shù)組的創(chuàng)建
那我們?nèi)绾味x?維數(shù)組呢?語法如下:
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
double data[2][8];
解釋:上述代碼中出現(xiàn)的信息
?
3表?數(shù)組有3?
?
5表?每??有5個元素
?
int 表?數(shù)組的每個元素是整型類型
?
arr 是數(shù)組名,可以根據(jù)??的需要指定名字
data數(shù)組意思基本?致。
4.3 二維數(shù)組的初始化
在創(chuàng)建變量或者數(shù)組的時候,給定?些初始值,被稱為初始化。
那?維數(shù)組如何初始化呢?像?維數(shù)組?樣,也是使??括號初始化的。
不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
?
完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
?
按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
?
初始化時省略行,但是不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};
4.5 二維數(shù)組的使用
當(dāng)我們掌握了?維數(shù)組的創(chuàng)建和初始化,那我們怎么使??維數(shù)組呢?
其實?維數(shù)組訪問也是使?下標(biāo)的形式的,?維數(shù)組是有?和列的,只要鎖定了?和列就能唯?鎖定數(shù)組中的?個元素。
C語?規(guī)定,?維數(shù)組的?是從0開始的,列也是從0開始的,如下所?:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
圖中最右側(cè)綠?的數(shù)字表??號,第??藍(lán)?的數(shù)字表?列號,都是從0開始的,?如,我們說:第2 ?,第4列,快速就能定位出7。
#include
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
printf("%d\n", arr[2][4]);
return 0;
}
4.6 二維數(shù)組的輸入和輸出
訪問?維數(shù)組的單個元素我們知道了,那如何訪問整個?維數(shù)組呢?
其實我們只要能夠按照?定的規(guī)律產(chǎn)?所有的?和列的數(shù)字就?;以上?段代碼中的arr數(shù)組為例,?的選擇范圍是0~2,列的取值范圍是0~4,所以我們可以借助循環(huán)實現(xiàn)?成所有的下標(biāo)。
#include
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;//遍歷?
//輸?
for(i=0; i<3; i++) //產(chǎn)??號
{
int j = 0;
for(j=0; j<5; j++) //產(chǎn)?列號
{
scanf("%d", &arr[i][j]); //輸?數(shù)據(jù)
}
}
//輸出
for(i=0; i<3; i++) //產(chǎn)??號
{
int j = 0;
for(j=0; j<5; j++) //產(chǎn)?列號
{
printf("%d ", arr[i][j]); //輸出數(shù)據(jù)
}
printf("\n");
}
return 0;
}
?
4.7?二維數(shù)組的儲存
像?維數(shù)組?樣,我們?nèi)绻胙芯?維數(shù)組在內(nèi)存中的存儲?式,我們也是可以打印出數(shù)組所有元素的地址的。代碼如下:
#include
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
從輸出的結(jié)果來看,每??內(nèi)部的每個元素都是相鄰的,地址之間相差4個字節(jié),跨?位置處的兩個元素(如:arr[0][4]和arr[1][0])之間也是差4個字節(jié),所以?維數(shù)組中的每個元素都是連續(xù)存放的。如下圖所?:
?了解清楚?維數(shù)組在內(nèi)存中的布局,有利于我們后期使?指針來訪問數(shù)組的學(xué)習(xí)。
五、C99中的變長數(shù)組
在C99標(biāo)準(zhǔn)之前,C語?在創(chuàng)建數(shù)組的時候,數(shù)組??的指定只能使?常量、常量表達(dá)式,或者如果我們初始化數(shù)據(jù)的話,可以省略數(shù)組??。
int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};
這樣的語法限制,讓我們創(chuàng)建數(shù)組就不夠靈活,有時候數(shù)組?了浪費(fèi)空間,有時候數(shù)組??了不夠?的。 C99中給?個變?數(shù)組(variable-length array,簡稱 VLA)的新特性,允許我們可以使?變量指定 數(shù)組??。 請看下?的代碼:
int n = a+b;
int arr[n];
上??例中,數(shù)組
arr
就是變?數(shù)組,因為它的?度取決于變量
n
的值,編譯器沒法事先確定,只
有運(yùn)?時才能知道
n
是多少。
變?數(shù)組的根本特征,就是數(shù)組?度只有運(yùn)?時才能確定,所以變?數(shù)組不能初始化。它的好處是程 序員不必在開發(fā)時,隨意為數(shù)組指定?個估計的?度,程序可以在運(yùn)?時為數(shù)組分配精確的?度。有 ?個?較迷惑的點(diǎn),變?數(shù)組的意思是數(shù)組的??是可以使?變量來指定的,在程序運(yùn)?的時候,根 據(jù)變量的??來指定數(shù)組的元素個數(shù),?不是說數(shù)組的??是可變的。數(shù)組的???旦確定就不能再 變化了。 遺憾的是在VS2022上,雖然?持?部分C99的語法,沒有?持C99中的變?數(shù)組,沒法測試;下?是我在gcc編譯器上測試,可以看?下
#include
int main()
{
int n = 0;
scanf("%d", &n);//根據(jù)輸?數(shù)值確定數(shù)組的??
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
第?次測試,我給n中輸?5,然后輸?5個數(shù)字在數(shù)組中,并正常輸出
第?次測試,我給n中輸?10,然后輸?10個數(shù)字在數(shù)組中,并正常輸出
六、二分查找
在?個升序的數(shù)組中查找指定的數(shù)字n,很容易想到的?法就是遍歷數(shù)組,但是這種?法效率?較低。 ?如我買了?雙鞋,你好奇問我多少錢,我說不超過300元。你還是好奇,你想知道到底多少,我就讓 你猜,你會怎么猜?你會1,2,3,4...這樣猜嗎?顯然很慢;?般你都會猜中間數(shù)字,?如:150,然后看?了還是?了,這就是?分查找,也叫折半查找。
#include
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
int key = 7;//要找的數(shù)字
int mid = 0;//記錄中間元素的下標(biāo)
int find = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
{
find = 1;
break;
}
}
if(1 == find )
printf("找到了,下標(biāo)是%d\n", mid);
else
printf("找不到\n");
return 0;
}
求中間元素的下標(biāo),使?
mid = (left+right)/2
,如果left和right?較?的時候可能存在問
題,可以使?下?的?式:
mid = left+(right-left)/2;
總結(jié)
重點(diǎn)理解數(shù)組的儲存是連續(xù)的,還有對二維數(shù)組的理解。自己實現(xiàn)一下二分查找??!
柚子快報激活碼778899分享:開發(fā)語言 C語言之“ 數(shù)組 ”
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。