admin 管理员组

文章数量: 887021


2023年12月24日发(作者:php很难学吗)

1. 变量的指针和指向变量的指针变量

读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。

1) 指针变量的定义

形式:类型标识符 *标识符 如:int *pointer;

要注意两点:*表示pointer是个指针变量,在用这个变量的时候不能写成*pointer, *pointer是pointer指向的变量。一个指针变量只能指向同一个类型的变量。如上面

pointer只能指向int型变量。

2)指针变量的引用

两个有关的运算符:

& 取地址运算符 &a 就代表变量a的地址

* 指针运算符 *a 就代表变量a的值

2. 数组的指针和指向数组的指针变量

数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。

1)指向数组元素的指针变量的定义与赋值

定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。

2)通过指针引用数组元素

我们通常引用数组元素的形式是a,如果用指针可以这样引用,*(a+i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用*(p+i)引用。

注意:指针变量p指向数组a首地址,则p++指向数组a的下一元素地址,即a[1]的地址。

3)数组名作函数参数

形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。

4)指向多维数组的指针和指针变量

以二维数组为居多。假设定义了一个二维数组a[3][4],那么

a代表整个二维数组的首地址,也代表第0行的首地址,同时也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。

假设a是一个数组的首地址,那么如果a是一维的,a+I代表第I个元素的地址,如果a是二维的,则a+I代表第I行的首地址。

那么第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或*(a+1)+2。

我们只要记住:在二维数组中a代表整个数组的首地址,a[I]代表第I行的首地址,a[I]与*(a+I)等价就行了。只要运用熟练了就没什么复杂的了。

5)指向由m个整数组成的一维数组的指针变量

如:int (*p)[4],p是一个指向包含4个元素的一维数组,如果p先指向a[0],则p+1指向a[1],即p的增值是以一维数组的长度为单位的,这里是4,举个例子:

假设a[3][4]=,p先指向a[0]也就是数组a的首地址,那么p+1就是a[1]的首地址即元素9的地址,因为在定义p时int (*p)[4],定义一维数组长度为4,所以p+1就等于加了一个一维数组的长度4。

3. 字符串的指针和指向字符串的指针变量

1)字符串的表示形式

c中字符串有两种表示形式:一种是数组,一种是字符指针

char string[]="I love c!";

char *str="I love c!";

其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str是一个字符串变量。

2)字符串指针作函数参数

实际上字符串指针就是数组的首地址。

3)字符指针变量与字符数组的区别

① 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串

② 对数组初始化要用static,对指针变量不用。

③ 对字符数组赋值,只能对各个元素赋值,不能象下面这样:

char str[14];

str="I love c!";

对指针变量可以,

char *str;

str="I love c!";

注意:此时赋给str的不是字符,而是字符串首地址。

④ 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定


本文标签: 变量 指针 数组 地址