初识指针
- 指针就是一个值为内存地址的变量(或数据对象)。
-
数组名是数组首元素的地址。也就是说,如果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来改变它所指向的值,记住是所指向的值,记住不能使用它而已,但可以通过其他变量来改变。

浙公网安备 33010602011771号