1、数组的初始化,比较简单,实例程如下:
1
2
3
4
5
6
7
8
9
|
#include<stdio.h>
# define M 12
int
main(
void
){
int
days[M]={31,28,31,30,31,30,31,30,30,31,30,31};
int
i;
for
(i=0;i<M;i++)
printf
(
"Months %d has %2d days.\n"
,i+1,days[i]);
return
0;
}
|
运行结果如下:
2.未经初始化的数组:
实例程序;
1
2
3
4
5
6
7
8
9
10
11
|
#include<stdio.h>
# define M 12
int
main(
void
){
int
N[M];
//未经初始化的数组
int
days[M]={31,28,31,30,31,30,31,30,30,31,30,31};
int
i;
for
(i=0;i<M;i++)
//printf("Months %d has %2d days.\n",i+1,days[i]);
printf
(
"%d %d\n"
, i,N[i]);
return
0;
}
|
运行结果:
由此可知,在初始化之前,数组元素的值是不确定的,编译器使用的数值是存储单元中已有的数值,上面的输出结果是不一定的。
3、在初始化数组的时候,编译器很机智,即使你给的元素数目小于或者为给定数组大小,编译器会自动识别,不够的话,它会自己用0代替。但是当初始化列表中有太多对的数目时,编译器会提醒错误。too many initializers太多初始化。如下删去几个元素,则结果:
1
2
3
4
5
6
7
8
9
10
11
|
#include<stdio.h>
# define M 12
int
main(
void
){
int
N[M];
//未经初始化的数组
int
days[M]={31,28,31,30,31,30,31,30};
int
i;
for
(i=0;i<M;i++)
printf
(
"Months %d has %2d days.\n"
,i+1,days[i]);
//printf("%d %d\n", i,N[i]);
return
0;
}
|
4、二维数组,举个栗子:float rain[5] [12] 首先,rain[5]表示一个包含五个元素的数组,至于每个元素的情况,需要查看声明的其余部分。剩余的便是float【12】,表示12浮点数的 数组。总之,该二维数组表示:rain具有5个元素,并且每个元素都是包含12个数值的数组。
具体理解画图如下:也算是挺明了的了。
5、指针和数组
指针提供了用来一种用来使用地址的符号方法。由于计算机的硬件指令很大程度上依赖于地址,所以指针能够使您以类似于计算机底层的底层的表达方式来表达自己的意愿。这使得应用了指针的程序能够更高效的工作,特别的,指针能够很有效的处理数组。
例子:数组名同时也是该数组首元素的地址。如a是一数组,则a==&a[0]//数组名是该数组首元素的地址。
指针加法:示例程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include<stdio.h>
#define SIZE 4
int
main(
void
){
short
dates [SIZE];
short
*pti;
short
index;
double
bills[SIZE];
double
* ptf;
pti=dates;
//把数组赋值给指针
ptf=bills;
printf
(
"%23s %10s\n"
,
"short"
,
"double"
);
for
(index=0;index<SIZE;index++)
printf
(
"pointers+%d: %10p %10p\n"
,index,pti+index,ptf+index);
return
0;
}
|
运行结果:
解析:我们的系统是按字节编制的,short类型使用两个字节,double类型8个字节,在C中,对一个指针加1的结果是对该指针增加一个存储单元。对于数组而言,地址会增加到下一个元素的地址,而不是下一个字节,这就是为什么在声明指针时必须声明它所指的对象类型,计算机需要知道存储对象所用的字节数。
关于指针:
指针的数值就是它所指向对象的地址,地址的内部表示方式是由硬件决定的,很多计算计算机都是以字节编址的,这意味着对每个内存字节顺序进行编号,对于包含多个字节的数据类型,比如double,对象的地址通常指首字节的地址。
在指针前运用*就可以得到该指针所指向的对象的数值。
对指针加1 ,等价于对指针的值加上他指向对象的字节的大小。