• 第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}}//复合字面量

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

  • 相关阅读:
    使用Springsecurity3.0 框架
    Spring3.0.2 使用全Annotation 与 Hessian 兼容配置
    Python Study PyCharm License
    Spring3.0.2 使用 Annotation 与 @Transactional 冲突问题解决方案
    「JOI 2014 Final」裁剪线
    CF700E Cool Slogans
    「JOISC 2014 Day4」两个人的星座
    ABC231H(二分图最小权边覆盖)
    JOISC 2017
    博弈论 初步
  • 原文地址:https://www.cnblogs.com/suwencjp/p/12391460.html
Copyright © 2020-2023  润新知