现在的位置: 首页 > 综合 > 正文

C语言-数组和指针

2012年02月11日 ⁄ 综合 ⁄ 共 2019字 ⁄ 字号 评论关闭

数组有一系列相同的元素构成。使用数组声明来告诉编译器需要一个数组。数值声明包括数组元素的数目和元素的类型。

要访问数组中的元素可以使用下标(index)来表示单个元素,index是从0开始计数的

 

数组的初始化:

比如

days[12]={31,29,31303130313130313031}

 

如果数组没有初始化

比如

int no_data[4]

当打印出数组元素时,数组的值是不定的。因为编译器使用的数值是存储单元中已有的数值。

 

初始化列表中的元素数目应该和数组大小一致。如果二者不一致:

1.比如当数值数目少于数组元素数目时,多余的数组元素被初始化为0。例子如下:

 1 #include <stdio.h>
2 #define SIZE 4
3 int main(void)
4 {
5 int some_data[SIZE]={1492,1066};
6 int i;
7 printf("%2s%14s\n","i","some_data[i]");
8 for(i=1;i<SIZE;i++)
9 printf("%2d%14d\n",i,some_data[i]);
10 return 0;
11 }

output:

 i  some_data[i]
1 1066
2 0
3 0

2.如果初始化列表中项目的个数大于数组大小,编译器会认为这个一个错误。程序就无法运行。

 

可以省略括号中的数字,从而让编译器自动匹配数组的大小和初始化列表中的项目数目

 1 #include <stdio.h>
2 int main(void)
3 {
4 const int days[]={31,28,31,30,31,30,31,31,30,31};
5 /*const:
6 有时需要使用只读数组,也就是程序从数组中读取数值,但是程序不想数组中写入数据。在这种情况下,可以使用关键字const。这样,程序会把数组中的每个元素当成常量来处理。用const声明之后不能再对它赋值*/
7 int index;
8 /*运算符sizeof给出其后的对象或类型的大小(以byte为单位)*/
9 for(index=0;index<sizeof days/sizeof days[0];index++)
10 printf("Monsth %2d has %d days.\n",index+1,days[index]);
11 return 0;
12 }

 

 

多维数组

多维数组是数组的数组。比如5年中每月的降水用float rain[5][12]来表示。可以解释为rain具有5个元素,并且每个元素都是包含12个float数值的数组。

用二维视图表示数组可以直观的想象两个索引的数组。实际上,数组是顺序存储的,前12个元素之后,耕者就是第二个包含23个元素的数组。

 

多维数组的初始化要注意几个问题:

1.比如:

const float rain[5][12]={
{4.3,4.3,1.2,3.0},
{5.2,3.0,1.6,3.5},
......
}

第一个列表中只有4个数值,则第一行只有前4个元素得到赋值,最后8个元素被默认初始化为0。如果列表中的数值多于12个,则报告错误,程序无法运行,而且这些数值不会影响到下一行的赋值。

2.初始化的时候也可以省略内部的花括号,只保留最外面一对花括号。只要保证数值的个数正确,初始化效果就是一样的。如果数值的个数不够,那么在数组初始化时候,按照先后顺序来逐行赋值,一次前面的元素首先得到赋值,直到后面没有赋值的元素被初始化为0.

 

指针和数组

数组名同时也是该数组首元素的地址

 1 #include <stdio.h>
2 #define SIZE 4
3 int main(void)
4 {
5 short dates[SIZE];
6 short * pti;
7 short index;
8 double bills[SIZE];
9 double * ptf;
10
11 pti=dates; /*把数组的首地址赋给指针*/
12 ptf=bills;
13 printf("%23s %10s\n","short","double");
14 for(index=0;index<SIZE;index++)
15 printf("pointers + %d: %10p %10p\n",index,pti+index,ptf+index);
16 return 0;
17 }

output:

                  short     double
pointers + 0: 0028FF0C 0028FEE8
pointers + 1: 0028FF0E 0028FEF0
pointers + 2: 0028FF10 0028FEF8
pointers + 3: 0028FF12 0028FF00

在上面的例子中,对一个指针加1的结果是对该指针增加一个存储单元。

因为在C语言中:对一个指针加1的结果是对该指针增加一个存储单元(也就是说:对指针加1,等价于对指针的值加上它指向的对象的字节大小)。对数组而言,地址会增加到下一个元素的地址,而不是下一个字节。

比如: *(days+index)和days[index]等价

 

//未完成

抱歉!评论已关闭.