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]);}
第二種方式:以字串形式輸出
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500180.html
標籤:其他
下一篇:第4章 復合型別
