黑马程序员———C语言———【二维数组、字符串】

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

—————————————————————————————————————————————————————————————————————————————

一、二维数组的定义

1、概念:可以看做是一个特殊的一维数组,这个一维数组的每个元素又是一个一维数组

2、定义:数据类型   数组名 [ 第一维的长度(行)] [ 第二维的长度(列)]

例如:int a[2][3];

1)这是一个特殊的一维素组,一维数组有两个元素a[0],a[1]

a[0] 它又存放了一个一维数组该数组长度为3

2)定义了一个2行3列的一个矩阵

3、注意事项:

(1)数组名不能和变量名同名

(2)数组的长度可以是常量表达式

(3)可以是变量(仅在xcode中支持)

(4)数组长度可以使用宏定义

二、初始化

(1)需要注意的是部分初始化:

int a[3][4]={0};所以元素的值都是0

int a[3][4]={1};第一个元素值是1,剩余的全是0

(2)二维数组中,第一维可以省略,第二维不能省略

三、遍历

1、概念:访问二维数组的每一个元素

2、如何访问:通过下标来访问,如:int a[3][4]

  0 1 2 3
0 00 01 02 03
1 10 11 12 13
2 20 21 22 23

3、代码:

黑马程序员———C语言———【二维数组、字符串】_第1张图片

、二维数组内存存储细节

1、存储方式

(1)计算机会给二维数组分配一块连续的存储空间

(2)数组名代表数组的首地址,从首地址位置,一次存入第1行,第2行

(3)每一行存储方式,从行首地址还是,一次存储行的第1个元素、第2个元素....

(4)每个元素占用相同的字节数(取决于数组类型)

(5)并且数组中元素之间的地址是连续

2、注意

(1)数组的首地址=数组名

(2)第一行的地址=数组的首地址=第一行第一个元素的地址

(3)没一行地址相差:列数*数据类型

3、二维数组占用的总字节数

(1)总字节数=每行占用的字节数之和

(2)总字节数=元素的个数*元素的类型=行*列*sieof(数组类型)

(3)总字节数=sizeof ( 数组名 ) 

4、每一行的字节数

sizeof(a[0])

5、每一行有多少列

列数=行的总字节数/每个元素占用的字节(数组类型)

五、二维数组作为函数参数

1、数组的元素作为函数的参数

sum (score[1][0],score[2][3]);

此处score[1][0]和score[2][3]都是一个变量

我们之前已经讲过了,变量作为函数的参数是值传递

黑马程序员———C语言———【二维数组、字符串】_第2张图片

2、数组名作为函数的参数

(1)print_arr(score[])

此处的score它是一个常量!保存的是数组的首地址

同样,在被调函数中使用sizeof(score)也不能计算出数组的长度

(2)数组名作为函数参数注意事项

1)类型和长度要一直

2)二维数组作为函数的形参,可以不写第一维的长度

黑马程序员———C语言———【二维数组、字符串】_第3张图片

—————————————————————————————————————————————————————————————————————————————

—————————————————————————————————————————————————————————————————————————————

一、字符串

1、概念:

字符串是位于双引号中的字符序列

在内存中以“\0”结束,所占字节比实际多一个

2、定义

(1)一维字符数组(用来存储字符的数组)定义

char 数组名[数组长度];

char ch[5];

char ch[5+2];

int len=4;  char ch[len];

char ch[M+2];//M是宏定义字符

(2)二维字符数组的定义

和一维字符数组区别不大。

3、初始化和引用

(1)初始化

1)定义同时进行初始化

char ch[5]={'a','b'};

char ch[]={'a','b'};

char ch1[3]={'a'};

char ch2[5]={[3]='a'};

2)先定义,后初始化

char ch[3];

ch[0]='a';

ch[1]='b';

ch[2]='c';

(2)引用(遍历)

略。

(3)字符数组是用来保存字符串的

二、字符串的输入和输出

使用%s输入和输出:

%s的注意点:注意空格问题。如果输入字符串有空格,则空格之后的字符无法被接收保存。

三、字符串结束符的使用

黑马程序员———C语言———【二维数组、字符串】_第4张图片

控制台会输出:xyzab

为什么:在内存中,先定义的变量在高地址,后定义的变量在低地址,所以打印ch1的时候会一直向下打印,把ch的字符也全部打印出来,直到遇见\0结束打印。

4、字符串长度计算方法

黑马程序员———C语言———【二维数组、字符串】_第5张图片

sizeof()在计算字符串长度时默认把\0也算上。

5、字符数组和普通数组的区别

(1)字符数组的每个元素类型都是char类型,整型数组的每个元素都是int类型

(2)scanf函数和printf函数都有执行的格式化字符%s为字符数组提供输入和输出,但是没有为int数组提供专门的格式化字符进行输入和输出

(3)字符数组初始化可以去掉大括号,整型数组初始化不可以去掉大括号

6、字符串处理函数gets()、puts()、strcat()

黑马程序员———C语言———【二维数组、字符串】_第6张图片

1)gets():1)可以接受空格

2)运行时会给出警告,内容为:warning :this program used gets(),whitch is unsafe

也就是不安全的,存在数组越界问题。

(2)puts():1)可以自动换行

2)()内必须是字符串数组

3)不可以格式化输出

(3)strcat(A,B):将B连接到A的后面,然后用A打印

(4)strcpy(oldstr,newstr):字符串拷贝函数,把newstr拷贝到oldstr,并且会覆盖掉oldstr的内容

黑马程序员———C语言———【二维数组、字符串】_第7张图片

(5)strcmp(str1,str2):字符串比较函数,有返回值,若返回值>0,则str1>str2,若返回值<0,则str1

比较的是每个字符在ascii码中的值和在ascii码表中出现的顺序。

黑马程序员———C语言———【二维数组、字符串】_第8张图片黑马程序员———C语言———【二维数组、字符串】_第9张图片

(6)strlen():字符串长度函数

1)计算的是字符串的长度(不包括\0)

2)只能计算字符串的长度

黑马程序员———C语言———【二维数组、字符串】_第10张图片

你可能感兴趣的:(黑马程序员———C语言———【二维数组、字符串】)