初识指针

 

  1. 指针就是一个值为内存地址的变量(或数据对象)。
  2. 数组名是数组首元素的地址。也就是说,如果a是一个数组,那么下面的语句成立:a==a[0];

    a和a[0]都表示数组首元素的内存地址。

  3.在C中,指针加1指的是增加一个存储单元。对于指针而言,这意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。

  4.在指针面前使用*运算符可以得到该指针所指向对象的值。

  5.指针加1,指针的值递增它所指向类型的大小(以字节为单位)。

  6.在数组中,a[i]与*(a+i)相同。

   int *a形式和int a[]形式都表示a是一个指向int的指针。但int a[]只能用于声明形式参数。

   下面四种函数原型是相同的:

    int  sun(int *a);

    int  sun(int *);

    int  sun(int a[ ]);

    int  sun(int [ ]);  

   7.地址应该和指针类型兼容。如不能把double类型的地址赋给int的指针,至少要避免不明智的类型转换。

   8.计算两个指针的差值。求差的两个指针分别指向同一个数组的不同元素,通过计算求出两元素之间的距离。差值的单位与数组类型的单位相同。

      注意:可以利用关系运算符比较两个指针的值,但前提是两个指针都指向相同类型的对象。

      如两个int类型的指针相减的值为2,则两个指针所指的两个元素相隔两个int。

   9.指针和多维数组。如果a是一个int类型的二维数组,则

    a                   --二维数组首元素的地址(每个元素都是内含两个int类型元素的一维数组)

    a+2              --二维数组的第三个元素(即一维数组)的地址

    *(a+2)      --二维数组第三个元素的首元素(一个int类型的值)地址

 

10.C语言传递多维数组的传统方法是把数组名(即数组的地址)传递给类型匹配的指针参数。声明这样的指针形参要指定所有的数组维度,除了第一个维度。要声明二维数组时,可以这样做,int a[ ][4]。注意,第一个方空格是空的。也可以在空格上加上大小,但编译器会自动忽视。a指向的是一个内含4个int类型值的数组,所以a+1表示a的地址加上4个int大小的字节。一般而言,声明一个指向N维数组的指针时,只能省略最左边方括号的值。因为第一对方括号只表明这是一个指针,而其他的方括号则用于描述指针所指数据对象的类型。

11.变长数组

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

  要声明一个带二维变长数组参数的函数,示例int  sum( int rows, int  cols, int  a[rows][cols] );

  C99/C11规定,可以省略原型中的参数名,但是在这种情况下,必须用星号来代替省略的维度:int  sum (int, int, int a[*][*] );

12.对形式参数使用const,示例:int  sum (const  int  a[ ], int  n );这样使用const并不是要求原函数是常量,而是该函数在处理数组时将其视为常量,不可更改。如果编写的函数不用修改数组,那么在申明数组形参时最好使用const。

  只能把非const数据的地址付给普通指针,这很合理,否则通过指针就能改变const数组中的数据。

  const  int  *a=rate;  //a指向数组的首元素

  表明不能使用a来改变它所指向的值,记住是所指向的值,记住不能使用它而已,但可以通过其他变量来改变。  

 

 

      

posted @ 2021-11-23 22:41  Godofball  阅读(127)  评论(0)    收藏  举报