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é)束了库快,是一個標
標準庫提供一個memset把字符數(shù)組清零 - 數(shù)組是一組數(shù)目固定产阱,類型相同的數(shù)據(jù)項渠退,數(shù)組中的數(shù)據(jù)項稱為元素。
int numbers [10];//聲明數(shù)組 類型名稱 數(shù)組名[元素個數(shù)] - 方括號中的數(shù)字定義了要存放在數(shù)組中的元素個數(shù)设预,稱為數(shù)組維
- 數(shù)組有一個類型徙歼,它組合了元素的類型和數(shù)組中的元素個數(shù)
- 存儲在數(shù)組中的每個數(shù)據(jù)項都用相同的名稱訪問,在上述例子中,該名稱就是numbers.可以在數(shù)組名稱后的方括號內(nèi)使用索引值魄梯,索引值是從零開始的連續(xù)的整數(shù)桨螺。0是第一個元素的索引值,注意酿秸,索引值是從0開始的灭翔,不是1.數(shù)組元素的索引值是與第一個元素的偏移量
存在的問題
如何訪問數(shù)組元素的值?
如何訪問數(shù)組元素辣苏?肝箱??
(1)要選擇某個元素稀蟋,可以在數(shù)組名稱后的方括號內(nèi)使用索引值
(2)在程序執(zhí)行期間計算的整數(shù)表達式煌张。該整數(shù)必須是對數(shù)組有效的索引值。
5.13 使用數(shù)組
- 數(shù)組可以由整個數(shù)組當作函數(shù)的參數(shù)退客,也可以由數(shù)組中的某個元素當作函數(shù)的參數(shù):
1骏融、整個數(shù)組當作函數(shù)參數(shù),即把數(shù)組名稱傳入函數(shù)中井辜,例如:
2绎谦、數(shù)組中的元素當作函數(shù)參數(shù)管闷,即把數(shù)組中的參數(shù)傳入函數(shù)中粥脚,例如:
數(shù)組作為函數(shù)參數(shù)時注意以下事項:
1、數(shù)組名作為函數(shù)實參傳遞時包个,函數(shù)定義處作為接收參數(shù)的數(shù)組類型形參既可以指定長度也可以不指定長度刷允。
2、數(shù)組元素作為函數(shù)實參傳遞時碧囊,數(shù)組元素類型必須與形參數(shù)據(jù)類型一致树灶。
5.2 尋址運算符 &
- 尋址運算符&輸出其操作數(shù)的內(nèi)存地址,尋址運算符&廣泛用于scanf()糯而,尋址運算符放在存儲輸入的變量名稱之前天通,scanf()函數(shù)就可以利用這個變量的地址
把尋址運算符放在變量名稱之前,函數(shù)就可以利用這個變量的地址熄驼。 - 使用%u顯示sizeof生成的值
使用新的格式說明符%p來輸出變量的地址(內(nèi)存地址)
5.3 數(shù)組名稱和地址
long number[4]
數(shù)組名稱number指定了存儲數(shù)據(jù)項的內(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 運算符可以計算指定類型的變量所占用的字節(jié)數(shù),
printf("The size of a variable of type long is %zu bytes.\n", sizeof(long));
- sizeof運算符后的類型名稱的括號是必須的
- 注意:
sizeof運算符生成size_t類型的值 - sizeof運算符用于數(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運算符計算數(shù)組中元素的數(shù)目
size_t element_count = sizeof values/sizeof values[0];
- 計算數(shù)組元素的數(shù)量
size_t element_count = sizeof values/sizeof(double);
- sizeof運算符應(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運算符計算數(shù)組的元素的個數(shù)
5.6 多維數(shù)組
- 聲明二維數(shù)組
float carrots[25] [50];
以上語句聲明了一個數(shù)組carrots轴或,它包含25行50個浮點數(shù)元素。注意:每一維都放在自己的方括號中仰禀。 - 聲明二維浮點數(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ù)組名稱[常量表達式1][常量表達式2]...[常量表達式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ù)少于行中的元素數(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運算符可以確定多維數(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ù)組的作用是什么???是為了達到怎樣的目的呢?是實現(xià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ù)組的的長度挤渐。因為size_t 是用實現(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]表示第一維下標的長度软免,就像購物時分類存放的購物;第二個[3]表示第二維下標的長度焚挠,就像每個購物袋中的元素膏萧。
我們可以把上面的數(shù)組看作一個3×3的矩陣,
如下圖:
多維數(shù)組的初始化與一維數(shù)組的初始化類似也是分兩種:
1蝌衔、數(shù)據(jù)類型 數(shù)組名稱[常量表達式1][常量表達式2]...[常量表達式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2榛泛、數(shù)據(jù)類型 數(shù)組名稱[常量表達式1][常量表達式2]...[常量表達式n]; 數(shù)組名稱[下標1][下標2]...[下標n] = 值;
多維數(shù)組初始化要注意以下事項:
1、采用第一種始化時數(shù)組聲明必須指定列的維數(shù)胚委。因為系統(tǒng)會根據(jù)數(shù)組中元素的總個數(shù)來分配空間挟鸠,當知道元素總個數(shù)以及列的維數(shù)后,會直接計算出行的維數(shù)亩冬;
2艘希、采用第二種初始化時數(shù)組聲明必須同時指定行和列的維數(shù)
現(xiàn)有三行三列的二維數(shù)組int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};硼身,編寫程序?qū)崿F(xiàn)計算對角線元素之和。
#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個學生的考試成績佳遂。要求編寫5個函數(shù),分別實現(xiàn)計算考試的總分撒顿,最高分丑罪,最低分,平均分和考試成績降序排序