C语言:数组和指针

数组和指针

const 指针 数组

数组

初始化

int powers[8] = {1,2,4,6,8,16,32,64}; /* 从ANSI C开始支持这种初始化 */

使用const声明数组

有时需要把数组设置为只读。这样,程序只能从数组中检索值,不能把 新值写入数组。要创建只读数组,应该用const声明和初始化数组。因此,初始化数组应改成:

const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};

这样修改后,程序在运行过程中就不能修改该数组中的内容。和普通变 量一样,应该使用声明来初始化 const 数据,因为一旦声明为 const,便不能 再给它赋值。明确了这一点,就可以在后面的例子中使用const了。

当初始化列表中的值少于数组元素个数 时,编译器会把剩余的元素都初始化为0。也就是说,如果不初始化数组, 数组元素和未初始化的普通变量一样,其中储存的都是垃圾值;但是,如果 部分初始化数组,剩余的元素就会被初始化为0。

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

const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31,  30, 31 };
/*如果初始化数组时省略方括号中的数字,编译器会根据初始化列表中的 项数来确定数组的大小。
*/

指定初始化器(C99)

利用 该特性可以初始化指定的数组元素。例如,只初始化数组中的最后一个元 素。对于传统的C初始化语法,必须初始化最后一个元素之前的所有元素, 才能初始化它:

int arr[6] = {0,0,0,0,0,212}; // 传统的语法

int arr[6] = {[5] = 212}; // 把arr[5]初始化为212

/*对于一般的初始化,在初始化一个元素后,未初始化的元素都会被设置 为0。*/

如果未指定元素大小会怎样?

int stuff[] = {1, [6] = 23};     //会发生什么?
int staff[] = {1, [6] = 4, 9, 10}; //会发生什么?
/*编译器会把数组的大小设置为足够装得下初始化的值。所以,stuff数组 有7个元素,编号为0~6;而staff数组的元素比stuff数组多两个(即有9个元 素)。
*/

指定数组的大小

在C99标准之前,声明数组时只能在方括号中使用整型常量表达式。所 谓整型常量表达式,是由整型常量构成的表达式。sizeof表达式被视为整型 常量,但是(与C++不同)const值不是。另外,表达式的值必须大于0:


多维数组

初始化

初始化二维数组是建立在初始化一维数组的基础上

const float rain[YEARS][MONTHS] =
{
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
{9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
{7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
{7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
};

指针和数组

指针提供一种以符号形式使用地址的方法。因为计 算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令 以更接近机器的方式表达。因此,使用指针的程序更有效率。尤其是,指针 能有效地处理数组。数组表示法其实是在变相地使用指 针。

//变相使用指针的例子:数组名是数组首元素的地址。
flizny == &flizny[0]; // 数组名是该数组首元素的地址

我们的系统中,地址按字节编址,short类型占用2字节,double类型占 用8字节。在C中,指针加1指的是增加一个存储单元。对数组而言,这意味 着把加1后的地址是下一个元素的地址,而不是下一个字节的地址(见图 10.3)。这是为什么必须声明指针所指向对象类型的原因之一。只知道地

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值