--android培训、java培训、ios学习型技术博客、期待与您交流!---------
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。
数组的几个名字:
1)数组:一组具有相同数据类型的数据的有序的集合
2)数组元素:构成数组的数据,数组中每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,也可称为下标变量。
3)数组的下标:是数组元素的位置的一个索引或指示。
4)数组的维数:数组元素的下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维数组。
按存储的内容分类:
数值数组:用来存储数值
字符数组:用来存储字符'a'
指针数组:用来存储指针(地址)
结构体数组:用来存储一个结构体类型的数据
一维数组:如果一个数组元素都不是数组,那么该数组称为一维数组。
使用流程:定义数组—>给数组初始化—>使用数组
一维数组的定义:类型说明符 数组名[常量表达式];(在C语言中使用数组必须先定义)
在4)中 若为:int len=4;
int a5[len]={0,1,2,3};
这是不允许的。
一维数组的初始化:
1)定义的时候初始化: 类型说明符 数组名[常量表达式]={值,值,值,值......值};
2)先定义数组再初始化
注意:如果对数组不进行初始化,数组中是有值的,是随机的垃圾数!
如果进行了部分初始化,没初始化的部分元素也自动的被系统初始化为0了!
特别强调:如果采用先定义后初始化的方式,部分元素被初始化,而没有被初始化的部分元素不会被系统自动赋值,里面存放的仍是垃圾数!
二维数组定义:类型说明符 数组名[常量表达式1][常量表达式2]
int a[3][4]
注意事项:1.数组名不能和变量名同名
2.数组的长度可以是常量表达式
3.数组长度可以使用宏定义
二维数组的初始化
1)定义的同时初始化
1.完全初始化
int a[2][3]={1,2,3,3,2,1};
1 2 3
3 2 1
int a[ ][3]={1,2,3,4,5,6,7,8,9};
1 2 3
4 5 6
7 8 9
2.部分初始化
int a[3][4]={1};
1 0 0 0
0 0 0 0
0 0 0 0
int a[3][4]={{1},{2},{3}};
1 0 0 0
2 0 0 0
3 0 0 0
int a[3][4]={1,2,3,4,5}}
1 2 3 4
5 0 0 0
0 0 0 0;
2)先定义后初始化
int a[3][4];
第一维下标:0 1 2
第二维下标:0 1 2 3
a[0][0]=1;
一维数组的存储方式:
1)计算机会给数组分配一块连续的存储空间
2)数组名代表数组的首地址,从首地址位置,依次存入数组的第一个、第二个.....第N个元素。
3)每个元素占用相同的字节数(取决于数组的类型)
4)并且元素之间的地址是连续的
二维数组的存储:
1)计算机会给二维数组一块连续的存储空间
2)数组名代表数组的首地址,从首地址位置依次存入第一行、第二行.....
3)每一行存储方式,从行首地址开始,一次存储行的第一个元素、第二个元素、第三个元素......
4)每个元素占用相同的字节数(取决于数组类型)
5)并且数组中元素之间的地址是连续的
一维数组长度计算的方法:
数组在内存中占用的总字节数:sizeof(数组名);
所以计算数组长度可以使用如下方法:
数组的长度=数组占用的总字节数/数组元素占用的字节数
二维数组中行数和列数的计算:
1)数组的首地址在二维数组中存在
数组的首地址=数组名=&a[0]=&a[0][0]
2)二维数组占用的总字节数=元素的个数*元素的类型 =行*列*sizeof(数组类型 )=sizeof(数组名)
二维数组占用的总字节数=每行占用的总字节数之和
3)每行的总字节数=sizeof(a[0])
4)每一行有多少列=sizeof(a[0])/sizeof(int)
一维数组可以作为函数的参数使用,进行数据的传递。
一维数组元素用作函数参数有两种形式:
1.一维数组元素就是下标变量,它与普通元素并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为函数实参的数组元素的值传给形参,实现单向的值传送。
2.数组名用作函数参数时要求形参和相对应的实参必须使类型相同的数组。形参数组和实参数组的长度可以不相同,因为在调用时只调用首地址,而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误,但程序执行结果将与实际不符。
二维数组做函数参数
1)二维数组元素做函数参数,相当于变量的值传递的过程。
2)二维数组名做函数参数,相当于地址传递。(实参与形参公用一块内存)
类型和长度要一致,可以不写第一维的长度。
字符数组的初始化及引用
1.初始化
1.定义同时初始化
char ch[5]={'a','b','c','d','e'};
char ch[3]={'a'}; a \0 \0
char ch2[5]={ch2[3]='b'};
2.先定义后初始化
char ch[3];
char ch[0]='a';
char ch[1]='b';
char ch[2]='c';
2.遍历(其实数组大多遍历有 for语句+ if语句 都可以解决)
3.字符数组是用来保存字符串
1. char ch[4]={"abc"};
ch[0]={'a'};
ch[1]={'b'};
ch[2]={'c'};
ch[3]={''\0};
2.char ch[4]="abc";
此处数组长度必须>=4
字符数组与普通数组的区别:数组类型指的是数组所包含的元素的类型,而不是数组名的类型,数组名永远只是一个指针,指向第一个元素的地址,即数组首地址。
字符数组的每个元素都是char型的,整形数组的每个元素都是int型的。
scanf()和printf()函数有一种格式化字符串%s可以用来整体输入输出字符数组,但是没有特定的格式支持int数组整体数组输出。
字符数组初始化可以去掉大括号,整形数组初始化不可以去掉大括号。
通过本章知识点的学习,掌握了一维、多维数组以及字符数组的基本概念。了解了数组的定义,存储方式,地址,for语句+if语句的遍历过程,初始化数组元素作为函数参数是值传递,数组名作为函数参数是地址的传递,在应用中一定要多加小心