C語言中二維數組、字符數組和字符串
一、二維數組
一般形式:
類型說明符 數組名 [ 常量表達式 ] [常量表達式 ];
例如:
int a[3][4];
二維數組常稱爲矩陣。二維數組可以看着是一種特殊的一維數組。
二、二維數組初始化
1、分行給二維數組初始化
int a[3][4] = { { 1,2,3,4 }, {
5,6,7,8 }, { 9,10,11,12 } };
2、可以將所有的數據寫在一個{ }內
int a[3][4] = { 1,2,3,4,5,6,7,8,
9,10,11,12 };
3、可以部分初始化
int
a[3][4] = { { 1 }, { 5 }, { 9 } };
他的作用是隻對各行第1列(即序號爲0的列)的元素賦初值,其餘元素自動賦值爲0,賦值後數組各元素爲:
1
0
0 0
5
0
0 0
9
0
0 0
4、也可以給某一元素賦值
int a[3][4] = { { 1 }, {
5, 6 }, { 0, 9 ,11 } };
初始化後的數組元素爲;
1
0
0 0
5
6
0 0
0
9
11 0
5、數組長度可以是常量表達式
int a[3][3+1] = { { 1 }, {
5, 6 }, { 0, 9 ,11 } };
6、二維數組可以省略第一維
int
a[ ][4] = { { 1,2,3,4 }, { 5, 6,7,8 }, { 9, 10 ,11,12 } };
7、二維數組也可以先定義後初始化
int
a[3][4] ;
a[3][4]
= { { 1 }, { 5, 6 }, { 0, 9 ,11 } };
三、二維數組的遍歷
利用一個雙循環對二維數組進行遍歷,外層循環控制列,內層循環控制行
#include <stdio.h>
#include <stdlib.h>
int main()
{ //定義變量
int m = 3;
int n = 4;
//定義二維數組
int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
//遍歷數組
for(m = 0; m < 3; m++)
{
for(n = 0; n < 4; n++)
{
printf("a[%d][%d] = %d ",m,n,a[m][n]);
}
printf("\n");
}
system("pause");
return 0;
}
測試結果:
四、二維數組的內存存儲細節
存儲方式
1、計算機會給二維數組分配一塊連續的存儲空間
2、數組名代表的是數組的首地址,從首地址位置其,依次存入第一行、第二行.......
3、每一行的存儲防暑,從行的首地址開始依次存儲行的第1個元素、第2個元素.....
4、每個元素佔用相同的字節數(取決於數組的類型)
5、數組元素之間的地址是連續的
測試代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{ //定義變量
int m = 3;
int n = 4;
//定義二維數組
int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
printf("二維數組元素\n");
//遍歷數組
for(m = 0; m < 3; m++)
{
for(n = 0; n < 4; n++)
{
printf("a[%d][%d] = %d ",m,n,a[m][n]);
}
printf("\n");
}
printf("\n\n");
//取出二維數組元素的地址
printf("二維數組首地址爲:&a = %p\n\n",a);
//二維數組的地址
printf("二維數組的地址\n");
int i,j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
//二維數組的元素的地址
printf("&a[%d][%d] = %p ",i,j,&a[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
測試結果:
二維數組佔用的總字節數:每行佔用的字節數之和。
測試代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定義一個數組
int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
//計算數組長度
printf("二維數組a[3][4]的長度爲:%d\n",sizeof(a));
system("pause");
return 0;
}
測試結果:
五、字符數組
字符數組的初始化和其他的一維數組的初始化基本相同
例如:char ch[ 3 ] = { 'a' }
它表示給字符數組的第一元素初始化爲字符a,其他元素的值系統自動初始化爲\0,對應的ASCII碼值爲0.
1、作用:1、保存字符
2、保存字符串,以\0結束。 C語言中沒有字符串類型,只能用字符數組存儲字符串
2、字符串:位於雙引號當中的字符序列
3、字符數組存儲字符串的初始化方式
(1)char [5] = "abcd"; 此處長度必須大於字符串的長度,因爲末尾需要存儲一個\0作爲結束符,因此常常省略字符數組的長度
(2)char [5] = {"abcd"}; 此處長度必須大於字符串的長度,因爲末尾需要存儲一個\0作爲結束符,因此常常省略字符數組的長度
測試代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定義字符數組
char s[6] = {'a','b','c','d','e','f'};
int i;
//遍歷字符數組
for(i = 0; i < sizeof(s); i++)
{
printf("s[%d] = %c\n",i,s[i]);
}
printf("\n");
//定義字符數組並初始化爲字符串
char str[7] = "abcdef";
int j;
//遍歷字符串
for(j = 0; j < sizeof(str); j++)
{
//計算數組長度
printf("str[%d] = %c\n",j,str[j]);
}
printf("\n");
//以字符串格式輸出
printf("以字符串格式輸出爲:%s\n",str);
system("pause");
return 0;
}
測試結果:
六、字符串的輸入和輸出
(1)以%c輸出時每次打印一個字符,需要循環才能實現字符串的全部輸出
(2)以%s格式輸出時可以從給定的地址開始一次打印一個字符串直到遇到\0結束
(3)以%s輸出一個字符數組,初始化時就必須以\0結束,如果不寫\0,則會打印出所有的字符直到遇到\0才結束輸出
測試代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定義字符數組
char s[] = "HeiMaXunLianYin";
//輸出字符串
printf(" %s\n",s);
printf("\n");
//從給定地址輸出
printf(" %s\n",&s[5]);
printf("\n");
//定義一個字符串
char s1[] = "HeiMa\0XunLianYin";
// 直到遇到\0結束測試
printf(" %s\n",s1);
system("pause");
return 0;
}
測試結果;
測試代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定義字符數組
char s[] = {'a','b','c','d'};
//輸出字符串
printf(" %s\n",s);
printf("\n");
//從給定地址輸出
printf(" %s\n",&s[2]);
printf("\n");
//定義一個字符串
char s1[] = {'a','b','c','d','\0'};
// 直到遇到\0結束測試
printf(" %s\n",s1);
//從給定地址輸出
printf(" %s\n",&s1[2]);
system("pause");
return 0;
}
測試結果
(4)以%s輸入時注意空格,如果輸入時含有空格,遇到空格就會結束
測試代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定義字符數組
char s[]={'0'};
//輸出字符串
printf("請輸入一個字符串\n",s);
//接受鍵盤輸入的值
scanf("%s",s);
//打印輸入的字符串
printf(" 您輸入的字符串爲:%s\n",s);
system("pause");
return 0;
}
測試結果1:
測試結果2: