数组的初始化和二维数组、指针与数组

简介:

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;
}

运行结果如下:

wKiom1mFclGASF3AAAAbKFdFV3Y993.png

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;
}

运行结果:

wKiom1mFdDri7apAAAAYrBIX32k377.png

由此可知,在初始化之前,数组元素的值是不确定的,编译器使用的数值是存储单元中已有的数值,上面的输出结果是不一定的。

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;
}

wKiom1mFdXOjwzWwAAAu-P9F5DE654.png

4、二维数组,举个栗子:float rain[5] [12] 首先,rain[5]表示一个包含五个元素的数组,至于每个元素的情况,需要查看声明的其余部分。剩余的便是float【12】,表示12浮点数的 数组。总之,该二维数组表示:rain具有5个元素,并且每个元素都是包含12个数值的数组。

具体理解画图如下:也算是挺明了的了。

wKioL1mFmnizRzCMAAQqD84Jjmo021.jpg



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;
}

运行结果:

wKioL1mH8Sfi-0-JAABajKhZSQ4868.png

解析:我们的系统是按字节编制的,short类型使用两个字节,double类型8个字节,在C中,对一个指针加1的结果是对该指针增加一个存储单元。对于数组而言,地址会增加到下一个元素的地址,而不是下一个字节,这就是为什么在声明指针时必须声明它所指的对象类型,计算机需要知道存储对象所用的字节数。

关于指针:

指针的数值就是它所指向对象的地址,地址的内部表示方式是由硬件决定的,很多计算计算机都是以字节编址的,这意味着对每个内存字节顺序进行编号,对于包含多个字节的数据类型,比如double,对象的地址通常指首字节的地址。

在指针前运用*就可以得到该指针所指向的对象的数值。

对指针加1 ,等价于对指针的值加上他指向对象的字节的大小。




本文转自 lillian_trip 51CTO博客,原文链接:http://blog.51cto.com/xiaoqiaoya/1953866,如需转载请自行联系原作者
相关文章
|
19天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
1月前
|
存储 编译器 C语言
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
|
19天前
指针指向数组
指针指向数组
17 0
|
21天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
34 1
|
21天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
14 0
|
1月前
|
C语言
指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)
指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)
|
1月前
|
存储 程序员 编译器
爱上C语言:指针很难?来来来,看看这篇(基础篇)
爱上C语言:指针很难?来来来,看看这篇(基础篇)
|
8天前
|
C语言
c语言指针总结
c语言指针总结
14 1
|
19天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针