學習目標
1.【掌握】二維數組的聲明和初始化es6
2.【掌握】遍歷二維數組數組
3.【掌握】二維數組在內存中的存儲ide
4.【掌握】二維數組與函數函數
5.【掌握】字符串學習
1、二維數組的聲明和初始化
二維數組也是數組,他具備數組的全部特性。在學習二維數組過程當中咱們徹底能夠把一維數組想象成一個「行結構」,把二維數組想象成是一個有行有列的「表格結構」,用每個單元格來存儲數據。es5
聲明語法:元素類型 數組名[行數][列數];spa
術語:code
元素:每個單元格就是二維數組的元素,用來存儲數據blog
下標:每一個元素的下標由兩個下標組成,一個行下標,一個列下標內存
長度:這個二維數組能夠存儲的數據的個數,也就是單元格的個數。
1
2
3
|
int
arr
[
3
]
[
4
]
;
//正確,三行四列的二維數組
int
arr1
[
5
]
[
2
]
;
//正確,五行二列的二維數組
int
arr2
[
]
[
]
;
//錯誤,須要指定行、列
|
注意:
1.必需要指定二維數組的行數和列數。
2.聲明二維數組的時候,行數、列數可使用常量、變量、表達式、宏。
3.行數、列數能夠是1,能夠是0,但不是負數和小數。
4.二維數組沒有爲數組元素賦值,那麼這些元素默認值是垃圾值。
賦值:數組名[行下標][列下標] = 數據;
根據下標爲二維數組賦值,最大行下標是行數 - 1,最大列下標是列數 - 1。
取值:數組名[行下標][列下標];
取值和賦值同樣,也是根據二維數組的下標來取值,最大行下標是行數 - 1,最大列下標是列數 - 1。
1
2
3
4
5
6
7
8
9
|
int
arr
[
3
]
[
4
]
;
//聲明一個3行、4列的二維數組
//爲二維數組中每一個元素賦值
arr
[
0
]
[
0
]
=
1
;
arr
[
0
]
[
1
]
=
2
;
arr
[
0
]
[
2
]
=
3
;
//......
arr
[
2
]
[
3
]
=
10
;
int
num
=
arr
[
0
]
[
2
]
;
//取值並賦值給一個同類型的變量
|
初始化:
聲明二維數組的同時爲二維數組的每一個元素賦值,初始化二維數組的時候,行數能夠省略,但列數無路如何都不能省略。初始化二維數組,支持所有初始化、部分初始化、指定初始化。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//所有初始化
int
arr
[
3
]
[
4
]
=
{
{
1
,
2
,
3
,
1
}
,
{
4
,
5
,
6
,
2
}
,
{
7
,
8
,
9
,
3
}
}
;
//聲明一個二維數組並初始化每一個元素
int
arr1
[
]
[
4
]
=
{
{
1
,
2
,
3
,
5
}
,
{
4
,
5
,
6
,
2
}
,
{
7
,
8
,
9
,
5
}
}
;
//初始化能夠省略行數,系統會根據後面大括號來計算出行數
int
arr2
[
2
]
[
5
]
=
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
}
;
//不須要大括號計算行,會根據行數和列數自動爲每一個元素賦值
int
arr3
[
]
[
5
]
=
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
}
;
//省略行,但不能省略列.自動從第一個元素依次爲每一個元素賦值
//部分初始化
int
arr4
[
3
]
[
4
]
=
{
{
1
}
,
{
2
}
,
{
3
}
}
;
//爲行第一個元素賦值,並初始化其餘元素爲0
int
arr5
[
3
]
[
4
]
=
{
1
,
2
,
3
,
4
}
;
//按照順序爲每個元素賦值,並初始化其餘元素爲0 00 01 02 03 10 11這樣的順序
int
arr5
[
]
[
4
]
=
{
1
,
2
,
3
,
4
}
;
//能夠省略行,自動根據列算出行,按照順序爲每個元素賦值,並初始化其餘元素爲0
//指定初始化
int
arr6
[
3
]
[
4
]
=
{
[
1
]
=
{
10
,
20
,
30
,
40
}
,
[
2
]
=
{
10
,
40
,
21
,
55
}
}
;
//爲行下標1和2的的元素賦值,其餘元素初始化0
|
2、遍歷二維數組
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
int
main
(
)
{
//聲明一個二維數組並初始化
int
arr
[
3
]
[
4
]
=
{
12
,
33
,
55
,
22
,
6
,
4
,
8
,
64
,
99
,
33
}
;
//外層控制行
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
//內層控制列
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
printf
(
"arr[%d][%d] = %d\n"
,
i
,
j
,
arr
[
i
]
[
j
]
)
;
}
}
return
0
;
}
|
3、二維數組在內存中的存儲
本質:
二維數組的本質實際上是一個一維數組,每一行就是這個一維數組的元素,也就是每一行都是一個一維數組,也就是一維數組的元素也是一個一維數組。好比:
1
2
3
4
5
6
7
8
9
10
11
12
|
//其實這是一個一維數組,一維數組的長度爲3,而且每個元素是一個長度爲4的一維數組數組。
int
arr
[
3
]
[
4
]
=
{
{
10
,
20
,
30
,
40
}
,
{
50
,
60
,
70
,
80
}
,
{
90
,
100
,
110
,
120
}
}
;
//遍歷一維數組第一個元素的數組裏的元素,也就是遍歷了二維數組的第1行的元素
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
printf
(
"arr[0][%d] = %d\n"
,
i
,
arr
[
0
]
[
i
]
)
;
}
printf
(
"arr[0] = %p\n"
,
arr
[
0
]
)
;
//arr[0] 就是第一個一維數組名
|
內存分配:在分配字節空間的時候,從高地址向低地址分配一塊連續的空間,空間的大小爲(每一個元素佔用的空間 * 元素個數)也就是(sizeof(數組的數據類型) * 行 * 列)。
1
2
3
4
5
|
長度
=
sizeof
(二維數組名
)
/
sizeof
(數據類型
)
;
行數
=
sizeof
(二維數組名
)
/
sizeof
(二維數組名
[
0
]
)
;
列數
=
sizeof
(二維數組名
[
0
]
)
/
sizeof
(數據類型
)
;
|
4、二維數組與函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <stdio.h>
//若是函數的參數是一個一維數組,那麼在調用函數的時候,能夠傳入一個二維數組的行,由於二維數組的行本質就是一個一維數組。
void
printfArray
(
int
arr
[
]
,
int
length
)
{
for
(
int
i
=
0
;
i
<
length
;
i
++
)
{
printf
(
"arr[0][%d] = %d\n"
,
i
,
arr
[
i
]
)
;
}
}
//當二維數組做爲函數的參數,那麼在調用函數的時候,須要先傳入二維數組的行和列,而後在傳入二維數組名,參數的二維數組必需要指定列。
void
test
(
int
rows
,
int
cols
,
int
arr
[
]
[
cols
]
)
{
for
(
int
i
=
0
;
i
<
rows
;
i
++
)
{
for
(
int
j
=
0
;
j
<
cols
;
j
++
)
{
printf
(
"arr[%d][%d] = %d\n"
,
i
,
j
,
arr
[
i
]
[
j
]
)
;
}
}
}
int
main
(
)
{
//隨便整一個二維數組
int
arr
[
4
]
[
10
]
=
{
76
,
45
,
3
,
98
,
65
,
3
,
77
,
43
,
24
,
90
,
87
,
64
}
;
//計算二維數組的行、列
int
rows
=
sizeof
(
arr
)
/
sizeof
(
arr
[
0
]
)
;
int
cols
=
sizeof
(
arr
[
0
]
)
/
sizeof
(
int
)
;
//arr[0]就是一維數組名
printfArray
(
arr
[
0
]
,
rows
)
;
//arr是二維數組名
test
(
rows
,
cols
,
arr
)
;
return
0
;
}
|
5、字符串
字符數組的聲明
1
|
char
chs
[
5
]
;
|
初始化
1
|
char
chs
[
5
]
=
{
'a'
,
'b'
,
'c'
,
'd'
}
;
//末尾自動補'\0'
|
遍歷字符數組
1
2
3
4
|
int
length
=
sizeof
(
chs
)
;
for
(
int
i
=
0
;
i
<
length
;
i
++
)
{
printf
(
"%c"
,
chs
[
i
]
)
;
}
|
字符數組的默認值
1.若是聲明一個字符數組,若是不爲字符數組初始化,那默認也是垃圾值。
2.若是聲明一個字符數組同時,咱們初始化了部分元素的值,其餘元素的值初始化爲'\0'。
3.'\0'表明一個不可見的值,打印出來聲明都沒有。
字符數組存儲字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//聲明5個長度的字符數組,並儲存字符
char
names
[
5
]
=
{
'a'
,
'b'
,
'c'
,
'd'
,
'\0'
}
;
//聲明5個長度的字符數組,只賦值部分元素,其他元素會自動初始化爲'\0'
char
names0
[
5
]
=
{
'a'
,
'b'
,
'c'
,
'd'
}
;
//聲明的時候初始化能夠省略長度,會自動計算出來的
char
names1
[
]
=
{
'a'
,
'b'
,
'c'
,
'd'
,
'\0'
}
;
//能夠簡寫,並自動追加'\0'存儲到字符數組
char
names2
[
]
=
{
"abcd"
}
;
//將字符串中的每個字符依次存儲到數組之中,並自動追加'\0'
char
names3
[
]
=
"abcd"
;
//不指定數組長度,那麼這個數組的長度就是字符串數據的字符個數+1
char
names4
[
]
=
"abcd"
;
//若是指定了字符數組的長度,那麼數組的長度就是指定長度,存儲的字符不能超過長度-1
char
names5
[
20
]
=
"abcd"
;
//若是在初始化一個字符數組的時候,能夠給中文。僅限在聲明的時候初始化給中文。
char
names6
[
]
=
"大狗"
;
|
輸出字符串
1
2
|
char
str
[
]
=
"jack"
;
printf
(
"%s"
,
str
)
;
//使用%s格式控制符輸出字符串,從給定字符數組地址開始,一個一個字符輸出,直到遇到'\0'就結束。
|
輸入字符串
1
2
|
char
str
[
20
]
;
scanf
(
"%s"
,
str
)
;
//輸入的字符不能超過給定的字符數組長度-1,而且不能讀取空格。若是輸入空格,會認爲是結束
|