5.1數(shù)組簡介
說明數(shù)組的概念的及其作用的最好方法,是通過一個例子,來說明使用數(shù)組后程序會變得非常簡單
5.1.1 不用數(shù)組的程序
如何聲明一個數(shù)組
數(shù)據(jù)類型 數(shù)組名稱[長度];
- C語言中的數(shù)組初始化是有三種形式的
數(shù)據(jù)類型 數(shù)組名稱[長度n] = {元素1,元素2…元素n};
數(shù)據(jù)類型 數(shù)組名稱[] = {元素1,元素2…元素n};
數(shù)據(jù)類型 數(shù)組名稱[長度n]; 數(shù)組名稱[0] = 元素1; 數(shù)組名稱[1] = 元素2; 數(shù)組名稱[n] = 元素n+1;
5.1.2 什么是數(shù)組
- 字符串碰到了零,就意味著字符串結(jié)束了,是一個標(biāo)
標(biāo)準(zhǔn)庫提供一個memset把字符數(shù)組清零 - 數(shù)組是一組數(shù)目固定,類型相同的數(shù)據(jù)項(xiàng),數(shù)組中的數(shù)據(jù)項(xiàng)稱為元素。
int numbers [10];//聲明數(shù)組 類型名稱 數(shù)組名[元素個數(shù)] - 方括號中的數(shù)字定義了要存放在數(shù)組中的元素個數(shù),稱為數(shù)組維
- 數(shù)組有一個類型,它組合了元素的類型和數(shù)組中的元素個數(shù)
- 存儲在數(shù)組中的每個數(shù)據(jù)項(xiàng)都用相同的名稱訪問,在上述例子中,該名稱就是numbers.可以在數(shù)組名稱后的方括號內(nèi)使用索引值,索引值是從零開始的連續(xù)的整數(shù)。0是第一個元素的索引值,注意,索引值是從0開始的,不是1.數(shù)組元素的索引值是與第一個元素的偏移量
存在的問題
如何訪問數(shù)組元素的值?
如何訪問數(shù)組元素???
(1)要選擇某個元素,可以在數(shù)組名稱后的方括號內(nèi)使用索引值
(2)在程序執(zhí)行期間計(jì)算的整數(shù)表達(dá)式。該整數(shù)必須是對數(shù)組有效的索引值。
5.13 使用數(shù)組
- 數(shù)組可以由整個數(shù)組當(dāng)作函數(shù)的參數(shù),也可以由數(shù)組中的某個元素當(dāng)作函數(shù)的參數(shù):
1、整個數(shù)組當(dāng)作函數(shù)參數(shù),即把數(shù)組名稱傳入函數(shù)中,例如:
2、數(shù)組中的元素當(dāng)作函數(shù)參數(shù),即把數(shù)組中的參數(shù)傳入函數(shù)中,例如:
數(shù)組作為函數(shù)參數(shù)時注意以下事項(xiàng):
1、數(shù)組名作為函數(shù)實(shí)參傳遞時,函數(shù)定義處作為接收參數(shù)的數(shù)組類型形參既可以指定長度也可以不指定長度。
2、數(shù)組元素作為函數(shù)實(shí)參傳遞時,數(shù)組元素類型必須與形參數(shù)據(jù)類型一致。
5.2 尋址運(yùn)算符 &
- 尋址運(yùn)算符&輸出其操作數(shù)的內(nèi)存地址,尋址運(yùn)算符&廣泛用于scanf(),尋址運(yùn)算符放在存儲輸入的變量名稱之前,scanf()函數(shù)就可以利用這個變量的地址
把尋址運(yùn)算符放在變量名稱之前,函數(shù)就可以利用這個變量的地址。 - 使用%u顯示sizeof生成的值
使用新的格式說明符%p來輸出變量的地址(內(nèi)存地址)
5.3 數(shù)組名稱和地址
long number[4]
數(shù)組名稱number指定了存儲數(shù)據(jù)項(xiàng)的內(nèi)存區(qū)域地址,把該地址和索引值組合起來就可以找到每一個元素
聲明數(shù)組時要給編譯器提供為數(shù)組分配內(nèi)存所需的所有信息。
- 值的類型決定了每個元素需要的字節(jié)數(shù)
數(shù)組維指定看元素的個數(shù) - 數(shù)組占用的字節(jié)數(shù)是元素個數(shù)乘以每個元素的字節(jié)數(shù)
- 數(shù)組元素的地址是數(shù)組開始的地址,加上元素的索引值乘以數(shù)組中每個元素類型所需的字節(jié)
5.4 數(shù)組的初始化
- 在大括號中指定一列初值,它們用逗號分開,并且數(shù)組大小由列表中的初值個數(shù)來確定。
double values[] = { 1.5, 2.5, 3.5, 4.5, 5.5 }
此語句聲明了包含5個元素的數(shù)組values,values[0]的初值是1.5 - 整個數(shù)組初始化為零
double values[5] ={0.0} - 前三個元素用括號內(nèi)的值初始化,后兩個元素初始化為0
double values[5] ={1.5, 2.5, 3.5}
5.5 確定數(shù)組的大小
- sizeof 運(yùn)算符可以計(jì)算指定類型的變量所占用的字節(jié)數(shù),
printf("The size of a variable of type long is %zu bytes.\n", sizeof(long));
- sizeof運(yùn)算符后的類型名稱的括號是必須的
- 注意:
sizeof運(yùn)算符生成size_t類型的值 - sizeof運(yùn)算符用于數(shù)組可以
- 數(shù)組的聲明
double values[5] = {1.5, 2.5, 3.5, 4.5, 5.5 }
- 可以用以下語句輸出這個數(shù)組所占用的字節(jié)數(shù)
printf("The size of the array, values , is %zu bytes.\n", sizeof values); - 輸出如下:
The size of the array, values, is 40 bytes.
*數(shù)組占用的內(nèi)存是單個元素的字節(jié)數(shù)乘以元素個數(shù), 使用sizeof運(yùn)算符計(jì)算數(shù)組中元素的數(shù)目
size_t element_count = sizeof values/sizeof values[0];
- 計(jì)算數(shù)組元素的數(shù)量
size_t element_count = sizeof values/sizeof(double);
- sizeof運(yùn)算符應(yīng)用于變量時不需要使用括號,但一般還是使用它們
double values[5] = {1.5, 2.5, 3.5, 4.5 , 5.5}
size_t element_count = sizeof(values)/sizeof(values[10])
printf("The size of the array is %zu bytes ", sizeof(values));
printf("and there are %u elements of %zu bytes each\n", element_count, sizeof(values)[0]));
該語句輸出如下:
The size of the arry is 40 bytes and there are 5 elements of 8 bytes each
*在使用循環(huán)處理數(shù)組
double values[5] = { 1.5, 2.5, 3.5, 4.5, 5.5 };
double sum = 0.0;
for(unsigned int i = 0; i < sizeof(values)/sizeof(values[0]) ; ++i)
sum +=values[i];
printf("The sum of the values is %.2f", sum );
這個循環(huán)將數(shù)組中所有的元素加起來,使用sizeof運(yùn)算符計(jì)算數(shù)組的元素的個數(shù)
5.6 多維數(shù)組
- 聲明二維數(shù)組
float carrots[25] [50];
以上語句聲明了一個數(shù)組carrots,它包含25行50個浮點(diǎn)數(shù)元素。注意:每一維都放在自己的方括號中。 - 聲明二維浮點(diǎn)數(shù)組
float number[3][5]; - 分配給每個元素的內(nèi)存量取決于數(shù)組所含的變量的類型
float number [4] [10]
數(shù)組元素類型float.占4 個字節(jié)。數(shù)組占用的內(nèi)存總數(shù)4410個字節(jié),即160個字節(jié)
5.7 多維數(shù)組的初始化
多維數(shù)組的定義格式是:
數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n];
二維數(shù)組的初始化
二維數(shù)組的初始化類似于一維數(shù)組的初始化,區(qū)別是把每一行的初始值放在大括號{}中,再把所有行放在一對大括號中:
int number [3] [4] = {
{ 10, 20, 30, 40 },
{ 15, 25, 35 ,45 },
{ 46, 48, 49, 59 }
};
三維數(shù)組的初始化
三維數(shù)組有三級嵌套的括號;內(nèi)層的括號包含每行的初始值。
int number [2][3][4] ={
{
{ 10, 20, 30, 40 },
{ 15, 25, 35 ,45 },
{ 46, 48, 49, 59 }
},
{
{ 10, 20, 30, 40 },
{ 15, 25, 35 ,45 },
{ 46, 48, 49, 59 }
}
};
如果提供的初始值個數(shù)少于行中的元素?cái)?shù),就必須給每一行的值加上括號。
- 利用嵌套循環(huán)處理多維數(shù)組中的所有元素,嵌套的層數(shù)就是數(shù)組的維數(shù)
int sum = 0;
for( int i = 0, i < 2; ++i)
{
for(int j = 0, j < 3; ++j)
{
for(int k =0, k <4 ; ++k)
{
sum += number[i][j][k];
}
}
}
printf("The sum of the value in the numbers array is %d.", sum);
- 使用sizeof運(yùn)算符可以確定多維數(shù)組中每一維的元素個數(shù)
for(int i = 0, i < sizeof(numbers)/sizeof(numbers[0]) ; ++i)
{
for(int j = 0, j < sizeof(numbers[0])/sizeof(numbers[0][0]) ; ++j)
{
for(int k = 0, k <sizeof(numbers[0][0]/sizeof(numbers[0][0][0]); ++k)
{
sum += numbers[i][j][k];
}
}
}
5.8變長數(shù)組
什么是變長數(shù)組?
變長數(shù)組的作用是什么???是為了達(dá)到怎樣的目的呢?是實(shí)現(xiàn)什么呢??
可以定義其長度在程序運(yùn)行期間確定的數(shù)組
size_t size = 0;
printf("Enter the number of elements you want to store: ");
scanf("%zd", &size);
float values[size];
以上代碼,把從鍵盤上讀取的一個值放在size中,使用size的值指定數(shù)組的的長度。因?yàn)閟ize_t 是用實(shí)現(xiàn)代碼定義的整數(shù)類型,
還可以在執(zhí)行期間確定二維或多維數(shù)組中的任意或所有維。例如:
size_t rows = 0;
size_t columns = 0;
printf("Enter the number of rows you want to store: ");
scanf("%zd",&rows);
printf("Enter the number of columns in a row: ");
scanf("%zd",&columns);
float beans[rows][columns];
#ifdef ___STDC_NO_VLA__
printf("Variable length arrays are not supported.\n");
exit(1);
#endif
以上代碼用于檢測編譯器是否支持變成數(shù)組。
這樣定義了一個名稱為num,數(shù)據(jù)類型為int的二維數(shù)組。其中第一個[3]表示第一維下標(biāo)的長度,就像購物時分類存放的購物;第二個[3]表示第二維下標(biāo)的長度,就像每個購物袋中的元素。
我們可以把上面的數(shù)組看作一個3×3的矩陣,
如下圖:
多維數(shù)組的初始化與一維數(shù)組的初始化類似也是分兩種:
1、數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2、數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n]; 數(shù)組名稱[下標(biāo)1][下標(biāo)2]...[下標(biāo)n] = 值;
多維數(shù)組初始化要注意以下事項(xiàng):
1、采用第一種始化時數(shù)組聲明必須指定列的維數(shù)。因?yàn)橄到y(tǒng)會根據(jù)數(shù)組中元素的總個數(shù)來分配空間,當(dāng)知道元素總個數(shù)以及列的維數(shù)后,會直接計(jì)算出行的維數(shù);
2、采用第二種初始化時數(shù)組聲明必須同時指定行和列的維數(shù)
現(xiàn)有三行三列的二維數(shù)組int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,編寫程序?qū)崿F(xiàn)計(jì)算對角線元素之和。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
char str[10]={'H','e','l','l','o','\0'}
printf("string length : %\n",strlen(str));
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main (void)
{
char str[] ="hello world";
for(int i=0;i<11;i++)
{
printf("[index:%d]%c\n",i,str[i]);
}
return 0;
}
如何在c語言中創(chuàng)建和使用數(shù)組
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int len =10;
int arr[len] ;//這種形式是錯的 int arr[10];
for(int a =0;a<len;a++)
{
arr[a] = 0;
}
for(int i =0;i<len;i++)
{
printf("index %d,and value is %d\n",i,arr[i]);
}
return 0;
}
數(shù)組的初始化
int arr[] ={1,2,5,7,3,8}
for(int i=0;i<6;i++)
{
printf("%d\n",arr[i]);
}
#include <stdio.h >
#include <stdlib.h >
int main (void)
{
int arr[3][4];
for(int i=0; i<3; i++)
{
for(int j=0; j<4;j++)
{
arr[i][j] =0;
}
}
for(int i=0; i< 3;i++)
{
for( int j =0;i<4;j++)
{
printf("index(%d,%d),%d\n",i,j,arr[i][j]);
}
}
return 0;
}
綜合題
在一個長度為10的整型數(shù)組里面,保存了班級10個學(xué)生的考試成績。要求編寫5個函數(shù),分別實(shí)現(xiàn)計(jì)算考試的總分,最高分,最低分,平均分和考試成績降序排序



