C语言为数据,提供了一种构造数据类型:数组
除引用外,数组的类型可以是任意的复合类型。数组定义中类型不能引用,即没有引用数组,这是因为引用不能被赋值,而数组中的元素必须被赋值
int & a[10];这样写是不正确的。
但是定义数组a的引用是可以的。
int a[6]={0,2,3,4,5,10};
int (&p)[6]=a;
如上,p是数组a的引用。
所谓数组就是一组具有相同类型的数据的有序集合。
int a[10];
float b[4];
注意:
int k,
int a[k]; /* 不能用变量说明数组大小*/
注意:在定义数组的时候,尽量在程序开头定义长度,不然改数组大小的时
候,非常麻烦!(编程规范)
例:#define N 10
int a[N ]
每个数据元素占用的字节数,就是基类型的字节数,一个元素占 4个字节;
越界访问,非法访问:
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<13;i++){
printf("a[%d]=%d\n",i,a[i]);
a[12]=100;//越界访问,非法访问
结果:.....i[10]、i[11]越界了,i[12]=12,越界访问以后,i[12]=10;
数组的初始化:若没有显示提供元素初值,则元素会被普通变量一样初始化
如果是全局数组,元素初始化为0;
如果是内置数组,元素无初始化。另外
在给数组部分赋值的时候,值送到数组的前几个元素中,后面
的元素编译器自动赋值为 0。当然,系统也会相应分配内存。
例:
int a[10]={1,2,3,4,5};
虽然只赋值了五个元素,但是,后五个元素的值默认初始化为 0。系统分配了
4*10=40的字节内存。
说明:函数不支持嵌套定义
注意:调用函数的时候,需要形式参数,比如:数组的数组名,以及数组的长
度;
例:
void print(int a[],int n)
print(a,10);
二维数组
int a[3][4](3行 4列),可以把二维数组看成一种特殊的一维数组,每个元
素就是一个一维数组;
存取方式:按行存取,行内按顺序存取;
二维数组初始化,可以省略行数(前面的值),不能省略列数;
内存存储:字节数=二维数组的元素个数*4;
注意:在输出的时候,一定要注意输出的格式和输出变量自身的数据类型
char a[10]:10个字节
二维数组怎么通过函数调用来打印?
void print(int b[][4],int row)
print(a,3);
注意:行数为空,列数不能为空!
"abcde"在内存中占用6个字节;C语言规定了一个“字符串结束标志”:
'\0';
字符数组并不要求它的最后一个字符为'\0',甚至可以不包括'\0'。系统对字
符串常量自动加一个'\0'。因此,为了使处理方法一致,在字符数组中也常人
为地加上一个'\0'。
实例:要用一个新的字符串代替原有的字符串”Pascal program” ,从键盘向
字符数组输入∶Hello ;如果不加′\0′的话,字符数组中的字符如下∶
Hellol program ;
字符数组的输入输出:
1.逐个字符输入输出,用格式符“%c”输入或输出一个字符;
2.将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输
出。
说明:
1.用“%s”格式符输出字符串时,printf函数中输出项是字符数组名,而不是
数组元素名;
2.如果数组长度大于字符串实际长度,也只输出到遇到'\0'结束;
3.输出字符不包括结束符‘\0’;
4.如果一个字符数组中包含一个以上的'\0',则遇到第一个'\0'时输出就结
束;
5.可以用scanf函数输入一个字符串;
6.scanf不会吸收回车换行和空格。
字符串处理函数:
· gets/puts系列
puts函数:[读取字符串]
语法: ostream &put( char ch );
一般格式:puts(字符数组);
用puts函数输出的字符串中可以包含转义字符,例如:\n;
函数put()用于输出流,并把字符ch写入流中。
作用:将一个字符串以'\0'结束的字符序列输出到终端。
gets函数:[打印字符串]
一般形式:gets(字符数组);
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值
是字符数组的起始地址。