數組就是具有一定順序關係的若干變量的集合。其中的每個變量,都被稱爲數組的元素
一維數組
1 定義
【存儲類型】 數據類型標識符[下標]
注意下標:C99可以變量,其它的必須常量或常量表達式
2 初始化
不初始化
局部數組不初始化,則數組中元素的值是不確定
全局數組不初始化,則數組中元素的值默認爲0
全部初始化
部分初始化
static
默認的狀況下,如果定義不初始化,數組元素值是隨機值,
如果用static默認全部初始化爲0
初始化爲0
1.int a[10]={0}
2.memeset(a,0,sizeof(a))
3.bzero(a,sizeof(a))
3 元素引用
數組名[下標]
4 數組名
數組名是表示地址的常量,也是數組的起始位置
5 數組越界
案例:
冒泡排序
冒泡排序的排序過程如下。
(1)比較第一個數與第二個數,若爲逆序a[0]>a[1],則交換;然後比較第二個數與第三個數;依次類推,直至第n-1個數和第n個數比較爲止——第一趟冒泡排序,最終,最大的數被安置在最後一個元素位置上。
(2)對前n-1個數進行第二趟冒泡排序,最終,使次大的數被安置在第n-1個元素位置。
(3)重複上述過程,共經過n-1次冒泡排序後,排序結束。
示例代碼如下:
#include <stdio.h>
#define N 10
int main(int argc,char **argv)
{
int a[N], i, j, t;
printf("Please input %d numbers\n",N);
for (i = 0; i < N; i++)
scanf("%d",&a[i]);
for (i = 0; i < N-1; i++)
for (j = 0; j < N-1-i; j++)
{
if (a[j] > a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
printf ("The array after sort:\n");
for (i = 0; i < N; i++)
printf ("%5d",a[i]);
printf("\n");
return 0;
}
選擇排序
選擇排序的排序過程如下。
(1)首先通過n-1次比較,從n個數中找出最小的, 將它與第一個數交換——第一次選擇排序,結果最小的數被安置在第一個元素位置上。
(2)再通過n-2次比較,從剩餘的n-1個數中找出關鍵字次小的記錄,將它與第二個數交換——第二次選擇排序。
(3)重複上述過程,共經過n-1次排序後,排序結束。
示例代碼如下:
#include <stdio.h>
#define N 10
int main(int argc,char **argv)
{
int a[N], i, j, r, t;
printf("Please input %d numbers\n",N);
for (i = 0; i < N; i++)
scanf("%d",&a[i]);
for (i = 0; i < N-1; i++)
{
r = i;
for (j = i+1; j < N; j++)
if (a[j] < a[r])
r = j;
if(r != i)
{
t = a[r];
a[r] = a[i];
a[i] = t;
}
}
printf ("the array after sort:\n");
for (i = 0; i < N; i++)
printf ("%5d",a[i]);
printf ("\n");
return 0;
}
二維數組
1 定義,初始化
【存儲類型】 數據類型 標識符 【行下標】 【列下標】
a[m][n]元素第一個元素是a[0][0]最後一個元素是a[m-1][n-1]
初始化,部分初始化,行初始化省掉
2 元素引用
數組名[行標][列標]
3 存儲形式
順序存儲
4 深入理解二維數組
int a[3][4]
a[0] | a[0][0] |
a[0][1] | |
a[0][2] | |
a[0][3] | |
a[1] | a[1][0] |
a[1][1] | |
a[1][2] | |
a[1][3] | |
a[2] | a[2][0] |
a[2][1] | |
a[2][2] | |
a[2][3] |
1. a是二維數組名,是地址常量。
2. a[0],a[1], a[2], a[3]實際上都是一維數組名,代表一維數組的起始地址,也都是地址常量。
3. a+1和a的地址差16個字節,相當於4個數組元素。因此,可以看出a代表第1行的地址,a+1代表第2 行的地址。
4. a[0]+1和a[0]的地址差4個字節,相當於1個數組元素。因此,a[0]+1相當於元素&a[0][1], a[1]+1相 當於元素&a[1][1],a[2]+1相當於元素&a[2][1]。
案例
有一個3×4的矩陣,要求輸出其中值最大的元素的值,以及它的行號和列號
int main(int argc, char *argv[])
{
int max, i, j, r, c;
int a[3][4] ={{24, 89, 2, 41}, {3, 11, 9, 1}};
max = a[0][0];
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
if (a[i][j] > max)
{
max = a[i][j];
r = i;
c = j;
}
printf("Max=%d, row=%d, column=%d\n", max, r, c);
return 0;
}
字符數組
1.定義,初始化,存儲特點
【存儲類型】數據類型 標識符【下標】。。。
單個字符初始化,和普通的數組相同,逐個爲數組元素賦值
char ch[6] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘\0’};
2.用字符串常量進行初始化,注意這個時候最後有一個\0
char ch[6]={“abcde”};
char ch[6]=“abcde”;
char ch[]=“abcde”;
char c[5] = {“abcde”};
相當於這樣的效果:char c[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘\0’};
字符串“abcde”,看起來只有5個字母,但字符串隱含了結束標誌\0,相當於6個字母,越界 了。
案例
#include <stdio.h>
int main()
{
int i=0;
char s[20]={0};
printf(">");
while(scanf("%s",s)!=EOF)
{
printf(">");
printf("i=%d:%s\n",i,s);
i++;
}
printf("end main\n");
return 0;
}
在本程序中,scanf函數是標準IO庫中的函數,IO庫中有緩衝區,當通過鍵盤輸入“how are you”時,首先是存放在C庫的緩衝區中,調用一次scanf函數, “how”被取出緩衝區,存到字符數組中,剩下的“are you”字符串仍在緩衝區中,這時,可以循環調用scanf函數二次,把緩衝區中剩下的字符取走。當輸入EOF時,scanf函數返回EOF,退出程序。