1 數組 1.1 數組概念 簡單來說,普通變數只能存取單個數據元素,與之不同,數組可以存取多個數據元素,記憶體中數組以順序結構存儲。 定義1:(數組) 同一類型數組中存取的元素類型相同,並且各個元素之間連續存儲。 1.2 整形數組 1.2.1 一維數組 (1)定義方式 類型說明符 數組名[常量表達式] ...
1 數組
1.1 數組概念
簡單來說,普通變數只能存取單個數據元素,與之不同,數組可以存取多個數據元素,記憶體中數組以順序結構存儲。
定義1:(數組) 同一類型數組中存取的元素類型相同,並且各個元素之間連續存儲。
1.2 整形數組
1.2.1 一維數組
(1)定義方式
類型說明符 數組名[常量表達式];
【例如】int shuzu[10];
定義一個大小為10的整形數組,只能存取int類型元素。記憶體地址連續分配,數組名 shuzu為數組的首地址,數組下標從0開始,shuzu+1表示數組第二個元素的地址,shuzu[2]表示為訪問shuzu的第3個元素值。
(2)初始化
數組初始化方式可分為四種。
第一種(完全初始化):定義數組元素時,為所有元素賦初始值
【例如】int shuzu[10]={ 0,1,2,3,4,5,6,7,8,9};
第二種(不完全初始化):定義數組元素時,為部分元素賦初始值
【例如】int shuzu[10]={ 0,1,2,3};
// 這裡只對數組前4個元素初始化,而數組後6個元素預設初始化為0;
第三種:定義數組元素時,可以不指定常量表達式值(即不指定數組大小),數組大小由初始化確定
例如:int shuzu[ ]={ 0,1,2,3};
// 表明當前數組大小為4
註意:
1、初始化過程中,常量表達式只能是常量,不能為變數 例如:int n=10, shuzu[10];
// 這種定義方式是錯誤的
2、初始化過程中,int shuzu[10]={ };
這種寫法是
3、初始化過程中,int shuzu[ ];
// 未指定數組大小,編譯錯誤
第四種:在程式運行當中為數組元素動態賦值
【例如】
# include <stdio.h>
int main(void)
{
int shuzu[10];
int i;
for (i=0; i<10; ++i)
{
scanf("%d", &shuzu[i]); // 也可以寫成 scanf("%d", shuzu+i);
}
return 0;
}
(3)一維數組的使用
使用方式:數組名[下標]
規定:數組必須先定義和初始化才能使用,並且只能逐個引用數組元素
【例如】
# include <stdio.h>
int main(void)
{
int shuzu[10]={ 0,1,2,3,4,5,6,7,8,9}; // 先定義並初始化
int b;
b=shuzu[1]+shuzu[2]+shuzu[2*3]; // 使用數組
printf("%d",b);
}
1.2.2 二維數組
(1)定義方式
類型說明符 數組名[常量表達式1][常量表達式];
【例如】int shuzu[2][3];
定義一個2行3列的整形數組,數組大小為2*3=6,只能存取int類型元素。
類似於一維數組,行和列下標都是從0開始,記憶體地址連續分配,按行順序存取,shuzu[0][0]表示第一個元素(即第一行第一列的元素),shuzu[0][1](即第一行第二列的元素)表示第二個元素,以此類推。
二維數組看作為由一維數組組成,如,shuzu[2][3]總共包含三個元素,每個元素由長度為3的一維數組組成。
難點:以指針形式看待定義的二維數組
數組名 shuzu 為二維數組的首地址(等於 shuzu第一行第一列元素首地址、也等於 shuzu的第一行元素的首地址),&shuzu[0][0]表示shuzu第一行第一列元素首地址,shuzu[0] 表示 shuzu的第一行元素的首地址。shuzu+1表示數組第二行元素的首地址。
【例如】
# include <stdio.h>
int main(void)
{
int shuzu[2][3]={{1,2,3},{4,5,6}}; // 先定義並初始化
printf("shuzu的地址為%d\n",shuzu);
printf("shuzu[0][0]的地址為%d\n",&shuzu[0][0]);
printf("shuzu+1的地址為%d\n",shuzu+1);
printf("shuzu[0]的地址為%d\n",shuzu[0]);
}
程式執行結果
因此,數組名 shuzu可看做指針的指針,shuzu[0] 可看作為指針,
(2)初始化
數組初始化方式可分為三種。
第一種(完全初始化):定義數組元素時,為所有元素賦初始值
方式一:【例如】 int shuzu[2][3]={{1,2,3},{4,5,6}};
// 每行寫在花括弧內
方式二:【例如】 int shuzu[2][3]={1,2,3,4,5,6}};
// 將所有元素寫在同一個括弧內
第二種(不完全初始化):定義數組元素時,為部分元素賦初始值
【例如】int shuzu[2][3]={{1,2},{4,5 }};
// 這裡只對數組的部分元素初始化,其餘元素預設初始化為0;
第三種:定義數組元素時,可以不指定常量表達式值(即不指定數組大小),數組大小由初始化確定
【例如】 int shuzu[2][3]={1,2,3,4,5,6}};
等價於 int shuzu[][3]={1,2,3,4,5,6}};
第四種:在程式運行當中為數組元素動態賦值
【例如】
# include <stdio.h>
int main(void)
{
int shuzu[2][3];
int i; //行迴圈變數
int j; //列迴圈變數
for (i=0; i<2; ++i)
{
for (j=0; j<3; ++j)
{
scanf("%d", &shuzu[i][j]);
}
}
return 0;
}
(3)二維數組的使用
使用方式:數組名[下標][下標]
規定:數組必須先定義和初始化才能使用,並且只能逐個引用數組元素
【例如】
# include <stdio.h>
int main(void)
{
int shuzu[2][3];
int i,j;
int b,c=1;
for (i=0; i<2; ++i)
{
for (j=0; j<3; ++j)
{
scanf("%d", &shuzu[i][j]);
}
}
b=shuzu[c][2]+shuzu[0+1][1*2];
printf("%d",b);
return 0;
}
1.3 字元數組
1.3.1 定義方式
定義2:(字元數組) char 數組名[數據長度]
字元數組用於存放字元或者字元串, 每個元素占用1位元組,。
註意:C語言沒有定義字元串類型,字元串常存放於字元數組當中。
【例如】char shuzu[10];
由於字元型數據在記憶體中以整數(ASCII碼)存儲,因此,也可以採用整形數組存放字元型數據。
例如: int shuzu[10];
然而,這時所占每個元素所占記憶體為4位元組。
1.3.2 初始化
(1) 字元常量初始化數組
當字元數組存放字元時,與整形數組初始化方式相同。
【例如】char shuzu[10]={'z','i','f','u','s','h','u',' ','z','u'};
char a []={'z','f','s','z'};
// 數組長度為4
(2) 字元串常量初始化數組
【例如】將char shuzu[10]={'z','i','f','u','s','h','u',' ','z','u'};
採用字元串常量初始化,
可寫為 char shuzu[ ]={"zifushu zu"};
也可寫為char shuzu[ ]="zifushu zu";
char shuzu[10]={'z','i','f','u','s','h','u',' ','z','u','/0'};
1.3.3 字元數組引用
(1)引用方式
數組名[下標]
【例如】
輸入"wo shi zi fu shu zu"
並輸出。
#include<stdio.h>
int main(void)
{
char a[]="wo shi zi fu shu zu";
int i;
while (a[i]!='\0'){
printf("%c",a[i]);
i++;
}}
也可寫為
#include<stdio.h>
#include<String.h>
int main(void)
{
char a[]="wo shi zi fu shu zu";
int i,len;
len=strlen(a);
for(i=0;i<len;i++)
printf("%c",a[i]);
}
結果為
1.3.4 輸入和輸出
(1)字元數組的輸入
第一種方式:有getchar()或scanf() 的‘%c’兩種輸入
【例如】char shuzu[5] 用 getchar() 賦值#include<stdio.h>
#include<string.h>
int main(void)
{
char shuzu[5];
int i;
for(i=0;i<5;i++)
shuzu[i]=getchar();
for(i=0;i<5;i++)
printf("%c",shuzu[i]);
}
當程式調用getchar()時,程式就等著用戶按鍵。用戶輸入的字元被存放在鍵盤緩衝區中,直到用戶按回車為止(回車字元也放在緩衝區中)。getchar可以從緩衝區讀走一個字元,相當於清除緩衝區 。
【例如】用scanf()賦值
#include<stdio.h>
int main(void)
{
char shuzu[5];
int i;
for(i=0;i<5;i++)
scanf("%c",&shuzu[i]);
for(i=0;i<5;i++)
printf("%c",shuzu[i]);
}
在 scanf 中,從鍵盤輸入的一切數據,不管是數字、字母,還是空格、回車、Tab 等字元,都會被當作數據存入緩衝區。存儲的順序是先輸入的排前面,後輸入的依次往後排。按回車鍵的時候 scanf 開始進入緩衝區取數據,從前往後依次取。
但 scanf 中 %d 只識別“十進位整數”。對 %d 而言,空格、回車、Tab 鍵都是區分數據與數據的分隔符。當 scanf 進入緩衝區中取數據的時候,如果 %d 遇到空格、回車、Tab 鍵,那麼它並不取用,而是跳過繼續往後取後面的數據,直到取到“十進位整數”為止。對於被跳過和取出的數據,系統會將它從緩衝區中釋放掉。未被跳過或取出的數據,系統會將它一直放在緩衝區中,直到下一個 scanf 來獲取。
但如果是 %c,那麼任何數據都會被當作一個字元,不管是數字還是空格、回車、Tab 鍵它都會取回。
第二種方式:以字元串形式輸入
用scanf()的'%s'對數組賦值。
scanf("%s",a);或scanf("%s“,&a[0]);
輸入”zifuchuan“並回車時,a數組會自動包含一個以”\0“結尾的字元串”zifuchuan“。
#include<stdio.h>
int main(void)
{
char shuzu[5];
int i;
scanf("%s",&shuzu[0]);
printf("%s\n",shuzu);
}
(2)字元數組的輸出
第一種方式:以字元形式輸入
用putchar()或printf()的‘%c’格式符對數組進行字元賦值。 【例如】對於數組a[10]:用putchar()輸出:#include<stdio.h>
#include<string.h>
int main(void)
{
char shuzu[5];
int i,len;
scanf("%s",shuzu);
len=strlen(shuzu);
for(i=0;i<len;i++)
putchar(shuzu[i]);
}
第二種方式:以字元串形式輸出