作者 :? ?會(huì)敲代碼的Steve
?
墓志銘:博學(xué)篤志? 切問靜思
前言:本文旨在復(fù)習(xí)C語言數(shù)組章節(jié)的知識(shí)點(diǎn)、分為以下幾個(gè)部分:
- 什么是數(shù)組
- 一維數(shù)組、一維數(shù)組的初始化、一維數(shù)組的遍歷、冒泡排序。
- 二維數(shù)組、二維數(shù)組的創(chuàng)建和初始化、二維數(shù)組的使用
- 數(shù)組作為函數(shù)傳參時(shí)
- 數(shù)組越界
- C99標(biāo)準(zhǔn)的變長數(shù)組
正文:?
目錄
1.什么是數(shù)組?
2.一維數(shù)組初始化
2.1 一維數(shù)組遍歷
2.2 冒泡排序
2.3 代碼
3.二維數(shù)組
3.1 二維數(shù)組的創(chuàng)建和初始化
3.2 二維數(shù)組的遍歷
4.數(shù)組作為函數(shù)元素傳參
5.c99標(biāo)準(zhǔn)的變長數(shù)組
2.一維數(shù)組初始化?數(shù)組是一組相同數(shù)據(jù)的集合
前面我們學(xué)習(xí)了如何定義一個(gè)變量,其中變量是這么定義的 :
int a; //int 數(shù)據(jù)類型 //變量名
那數(shù)組是如何定義的呢? 讓我們看下面的代碼
int arr[5]={0,1,2,3,4}; //int 數(shù)據(jù)類型 arr 數(shù)組名 //[5]代表里面有五個(gè)元素
所以這是一個(gè)包含有5個(gè)元素的int類型數(shù)組;? ?
數(shù)組的初始化:
數(shù)組的初始化是指,在創(chuàng)建數(shù)組的同時(shí)給數(shù)組的內(nèi)容一些合理初始值(初始化)
但是對(duì)于下面的代碼要區(qū)分,內(nèi)存中如何分配。?
char arr1[] = "abc";
char arr2[3] = {'a','b','c'};
對(duì)于數(shù)組的使用我們之前介紹了一個(gè)操作符: [] ,下標(biāo)引用操作符。它其實(shí)就數(shù)組訪問的操作符。 我們來看代碼:
# includeint main (void)
{
int arr[5]={0,1,2,3,4};//數(shù)組的完全初始化
}
總結(jié):
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
2.1 一維數(shù)組遍歷數(shù)組是可以通過下標(biāo)的方式來遍歷,上面已經(jīng)介紹過了數(shù)組的初始化,我們來嘗試一下寫寫代碼。
for(int i = 0;i<5;i++)
{
printf("%d ",arr[i]);//依次訪問0-4的所有數(shù)組元素
}
return 0;
于是這就是數(shù)組的一個(gè)簡(jiǎn)單的遍歷。?
補(bǔ)充:
數(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í),最好自己做越界的檢查。
#includeint 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;
}
二維數(shù)組的行和列也可能存在越界。?
2.2 冒泡排序冒泡排序(Bubble Sort)也是一種簡(jiǎn)單直觀的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢"浮"到數(shù)列的頂端。
作為最簡(jiǎn)單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書里出現(xiàn)的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優(yōu)化算法,就是立一個(gè) flag,當(dāng)在一趟序列遍歷中元素沒有發(fā)生交換,則證明該序列已經(jīng)有序。但這種改進(jìn)對(duì)于提升性能來
說并沒有什么太大作用。
1. 算法步驟比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是大的數(shù)。
針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
2. 動(dòng)圖演示 2.3 代碼#includeint main() {
int a, b, temp;
int m[10];
for (a = 0; a< 10; a++) {
scanf("%d", &m[a]);
}
for (a = 0; a< 9; a++) {
for (b = a + 1; b< 10; b++) {
if (m[a] >m[a + 1]) {
temp = a[m];
a[m] = a[m + 1];
a[m + 1] = temp;
}
}
}
for (a = 0; a< 10; a++) {
printf("%d ", m[a]);
}
return 0;
}
3.二維數(shù)組二維數(shù)組只是比一維數(shù)組多一個(gè)維度,可以理解為矩陣。
3.1 二維數(shù)組的創(chuàng)建和初始化創(chuàng)建:
//數(shù)組創(chuàng)建
int arr[3][4];
char arr[3][5];
double arr[2][4];
初始化:
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二維數(shù)組如果有初始化,行可以省略,列不能省略
3.2 二維數(shù)組的遍歷define _CRT_SECURE_NO_WARNINGS
#include#include#include#include#includeint main(void)
{
int arr[3][4] = { {2, 7, 8, 5},
{75, 8, 9, 8},
{26, 37, 99, 9} };
for (size_t i = 0; i< 3; i++) //行
{
for (size_t j = 0; j< 4; j++) //列
{
printf("%d ", arr[i][j]*2);
}
printf("\n");
}
4.數(shù)組作為函數(shù)元素傳參往往我們?cè)趯懘a的時(shí)候,會(huì)將數(shù)組作為參數(shù)傳個(gè)函數(shù),比如:我要實(shí)現(xiàn)一個(gè)冒泡排序(這里要講算法 思想)函數(shù) 將一個(gè)整形數(shù)組排序。
錯(cuò)誤的冒泡排序:
#includevoid sort(int arr[]);
int main()
{
int i = 0;
int rtr[10]={0};
for(i = 0;i<10;i++)
{
scanf("%d",&rtr[i]);
}
sort(rtr);
for(i = 0;i<10;i++)
{
printf("%d ",rtr[i]);
}
return 0;
}
void sort(int arr[])
{
int sz = sizeof(arr)/sizeof(arr[0]);
int i,j = 0;
for(i = 0;iarr[j+1])
{
int temp = arr[j];
arr[j]=arr[j+1];
temp = arr[j];
}
}
}
}
難道數(shù)組作為函數(shù)參數(shù)的時(shí)候,不是把整個(gè)數(shù)組的傳遞過去?
正確的冒泡排序:?
#includevoid sort(int arr[],int sz);
int main()
{
int i = 0;
int rtr[10]={0};
int sz = sizeof(rtr)/sizeof(rtr[0]);
for(i = 0;iarr[j+1])
{
int temp = arr[j];
arr[j]=arr[j+1];
temp = arr[j];
}
}
}
}
數(shù)組名是什么?
#includeint main()
{
int arr[10] = {1,2,3,4,5};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%d\n", *arr);
//輸出結(jié)果
return 0;
}
如果數(shù)組名是首元素地址,那么:
int arr[10] = {0};
printf("%d\n", sizeof(arr));
為什么輸出的結(jié)果是:40?
這樣的代碼會(huì)報(bào)錯(cuò)嗎?
#includeint main()
{
int n = 5;
int arr[n];
}
答案是在C99標(biāo)準(zhǔn)下,并不會(huì);但如果在msvc里面則使用會(huì)提示你要使用變量而不是常量。這就是C99標(biāo)準(zhǔn)。?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧