第10章 数组和指针

10.1  数组

数组由相同类型的一系列元素组成。

10.1.1  初始化数组

例:int power[3]={1,2,3}

注意:使用const声明数组

例:const int power[3]={1,2,3}表示数组只读。

注意:存储类别警告

本节描述都为自动存储类别

10.1.2  指定初始化器(c99)

该特性指可以单独只初始化数组中指定的数组元素。

例:int day[10]={31,28,[4]=31,30,31,[1]=29},

打印结果:1--31  2--29  3--0  4--0  5--31  6--30  7--31  8--0  9--0  10--0  :该处1,2,3表示数组中第几个元素。

该处程序[1]:先被初始化为28,后被指定为29。

[4]=31,30,31:[4]被初始化为31,后面的值将用于初始化后面元素;

性质:1:如果指定初始化器后面有更多的值,那么这些值将被用于初始化指定元素后面的元素

2:如果再次初始化元素,最后的初始化将取代之前的初始化。

当未指定元素大小时:

int stuff[]={1,[2]=23}  int staff[]={1,[2]=23,4,9}

编译器会把数组大小设置为足够装下初始化的值,即stufff有2个元素,staff有4个元素。

10.1.3  给数组元素赋值

 声明数组后,可以借助数组下表或索引

int  oxen[size]={1,2,3}

int yaks[size]

yaks=oxen        //不允许把数组作为一个单元赋值给另一个数组

yska[size]=oxen[size]      //数组下标越界

yaks[szie-1]={1,2,3}      //除了初始化以外,不允许使用花括号列表的形式赋值

10.1.4  数组边界

使用越界下标结果是未定义的。

10.1.5  指定数组的大小

声明数组只能在方括号中使用 整形常量表达式,另外表达式的值必须大于零。

10.2  多维数组

例 float rain[5][12]:表示内含5个数组元素的数组,每个数组元素内含12个float类型的元素。

10.2.1  初始化二维数组

例:

float rain[5][2]=
{
    {1,2}
    {1,2}
    {1,2}
    {1,2}
    {1,2}
    {1,2}
};

10.2.2  其他多维数组

通常处理3维数组需要3层嵌套循环

10.3  数组和指针

指针的值是它指向对象的地址。

在指针前使用*可以得到该指针所指对象的值

在c中,指针加1指的是递增它所指向类型的大小(以字节为单位)。

 *间接运算符优先级大于+

所以

*data+2表示第一个元素的值加2.

*(data+2)表示第3个元素的值

10.4  函数数组指针

例:编写一个返回数组中所有元素的和

int sum(int *ar,int n)第一个形参告诉该数组的地址和数据类型,第二个形参告诉函数该数组中元素个数。

在函数原型或函数定义中

int sum(int ar[] , int n )等价与int sum(int *ar , int n)

10.4.1  使用指针形参

函数处理数组必须知道何时开始和结束,可以同时传递两个指针,一个开始,一个结束。

注意:c在给数组分配空间时,指向数组后面第一个指针仍是有效指针

10.4.2  指针表示法和数组表示法

10.5  指针操作

赋值:把地址赋给指针。

解引用:*运算符给出指针指向地址上的值。

取值:&给出指针本身的地址。

指针和整数相加:整数会和指针所指向类型的大小(以字节为单位)相乘,然后把结果与初始值相加。

递增指针:递增可以让数组元素指针指向数组下一个元素。

指针减去一个整数:

递减指针:

指针求差:

比较:

注意:创建一个指针时,系统只分配了储存了指针本身的内存,并未分配其存储数据的内存(即指向的目标内存)。

10.6  保护数组中的数据

10.6  对形式参数使用const

例:int sum(const int ar [] , int  n);即表示处理数组时将其视为常量,不可更改,并不是要求原数组是常量。

10.6.2  const的其他内容

指向const的指针不能用于改变数组元素的值。

例:int rate [3]={1,2,3}

  const int*pd=rate

*pd=4;  //不允许

pd[2]=4  //不允许

rate[0]=2  //允许

规则:把const数据或者非const数据的地址初始化为指向const的指针或为其赋值是合法的,然而只能把非const数据赋值给普通指针。

即要满足:指向const的指针不能用于改变数组元素的值

const int * pa  表示不允许修改指向对象的值。

int const *pb  表示不允许修改其存储的值

10.7  指针和多维数组

 10.7.1  指向多维数组的指针

int (*pz)[2]  pz指向一个内含两个int 类型值的数组。

int *pax [2]  表示pax是一个内含两个指针元素的数组,每个元素都指向int类型

10.7.2  指针的兼容性

10.7.3  函数和多维数组

void some ( int  (*pz)[4] )

如果pz当且仅当是一个函数的形式参数时:

可以这样声明:void some(int pz[] [4])注意:第一个方括号是空的,空的方括号表示pz是一个指针。

10.8  变长数组(VLA)

例 int a=2;int b=2;

int sele [a][b];

注意:变长数组中的变不是指可以修改已创建数组的大小,一旦创建了变长数组,它的大小就保持不变。

这里的变是指:在创建数组示,可以用变量来指定数组的维度。

10.9  复合字面量

{int [2] {1 , 2}}//复合字面量

因为复合字面量是匿名的,必须在创建的同时使用他

原文地址:https://www.cnblogs.com/suwencjp/p/12391460.html