首页 理论教育 指针与指针变量的使用及操作方法

指针与指针变量的使用及操作方法

时间:2023-11-17 理论教育 版权反馈
【摘要】:而使用指针变量的目的在于对其指向的变量进行操作,因此要表示指针变量所指向的对象,就要使用指针运算符“”。定义了数组指针后,指针变量的直接操作对象是二维数组的行,移动以行为单位进行。通过指针变量引用二维数组单个元素的形式发生变化。

指针与指针变量的使用及操作方法

1.地址指针与指针变量

(1)地址

在程序中定义的变量都会在编译时分配对应的存储单元,变量的值存放在存储单元中,而存储单元都有相应的地址,也就是我们对存储单元的编号即是地址。

(2)指针

变量的地址称为变量的指针,因此指针即是地址。

(3)指针变量

指针变量是专门用来存放指针的变量,即专门存放其他变量地址的变量。

2.指针变量的定义

(1)指针变量的定义

指针变量需要在定义时用星号“∗”作为类型标识,其定义格式为:

类型标识符* 指针变量名;

(2)指针变量的赋值——取地址运算符&

指针变量通过存放其中的指针指向另外一个变量。在指针变量的赋值中常要用到地址运算符“&”,该运算的作用是得到其后变量的内存单元地址。

指针变量名=&所指向的变量名;

(3)指针变量的引用——指针运算符∗

指针变量只有在被赋值后,才能被使用。而使用指针变量的目的在于对其指向的变量进行操作,因此要表示指针变量所指向的对象,就要使用指针运算符“∗”。

例如:

进行以上的定义和赋值后,指针变量p 就指向整型变量n,输出的∗p 即表示输出n 的值,通过n 和∗p 输出的结果是相同的,都是10。

注意,在上面程序中出现了两个“∗”号,其意义是不同的:第一处的“∗”号是一个类型标识符,不是运算符,用于标识变量的p 为指针类型变量;printf 中的“∗”号才是指针运算符。“∗”号与指针变量结合则是取指针变量所指向的地址里的值。

3.指针与一维数组

指针变量=数组名;

数组名代表该数组的首地址,即指针变量指向该数组的首个元素。并且只要定义的指针变量类型与数组类型相同,指针变量加1,则指针位置刚好移动一个元素位置,加2,则移动2 个元素位置,加n,则移动n 个元素位置。

数组的第一个元素是a[0],用指针访问则可以写成∗p;p+1 指向第二个元素,要访问第二个元素可以写成(p+1)。这样,引入指针变量后,就可以用两种方法来访问数组元素了。

若p 的初值为&a[0],则:

p+i 和a+i 就是a[i]的地址,或者说它们指向a 数组的第i 个元素。

∗(p+i)或∗(a+i)就是p+i 或a+i 所指向的数组元素,即a[i]。例如,∗(p+5)或∗(a+5)就是a[5]。引用一个数组元素可以用:

①下标法:用a[i]形式访问数组数组。

②指针法:采用∗(a+i)或∗(p+i)形式,其中a 是数组名,p 是指向数组的指针变量。

③指针下标法:采用p[i]形式,当p=a;p[i]与a[i]等效,但a 是常量地址,而p 是变量地址。

当指针运算符和自增或自减运算符同时出现针对一个变量运算时,其位置关系的不同,对应的意义也不同。

例如,当指针变量p 指向数组元素a[0]的情况下。

①(∗p)++:表示先取∗p 的值a[0],再使所指元素的值加1。

②++(∗p)即++∗p:表示先使∗p 的值加1,即a[0]=a[0]+1,再取∗p 的值a[0]。

③∗p++即∗(p++):表示先取p,再使p 加1,指向下一个元素a[1]。

④∗++p 即∗(++p):表示先使p 加1,指向下一个元素a[1],再取∗p 的值a[1]。

4.指针与二维数组

(1)二维数组把数据的组织分为3 个层次:一是整个由行和列组成的二维数组,二是二维数组中的行,三是二维数组每行中的单个元素。

(2)指向二维数组的指针变量

指向二维数组的指针变量,有多种形式,主要分为两大类,分别表示指向元素的指针变量和指向行的指针变量。

①定义指向元素的指针变量:int ∗p;

该指针变量的特点是:指针的移动是以单个元素为基本单位,按照元素从上到下、行从左到右的顺序进行移动。

②指向二维数组中某行的指针变量

定义指向二维数组中某行的指针变量,需要先定义指针变量为指向一维数组(行)的指针变量,这类指针被称为“数组指针”,其定义格式为:

指针类型名(* 指针变量名)[长度];

用一对圆括号把星号“∗”和“指针变量名”括起来,表示该变量首先是一个指针类型变量;后面再跟上方括号,说明该指针变量所指的对象是一个一维数组,方括号内的“长度”表示所指一维数组的元素个数。

定义了数组指针后,指针变量的直接操作对象是二维数组的行,移动以行为单位进行。

例如:当p 指向二维数组b 的第一行b[0],p++后,p 将指向第二行b[1]。

通过指针变量引用二维数组单个元素的形式发生变化。由于指针p 的指向对象是整行,若当前指针p 指向第一行b[0],则对元素b[i][j]的引用格式是∗(∗(p+i)+j)。(www.xing528.com)

5.指针与字符

(1)指针变量直接指向常量字符串。例如:

char * p; p="apple";

把字符串存储区的起始地址赋值给指针变量p。

(2)指针变量指向已定义的字符数组。例如:

char s[10]={"apple"},* p; p=s;

6.指针数组

指针数组是指其元素为指针变量的数组,格式为:

类型标识符 * 数组名[长度];

“数组名”先与右边的方括号相结合,表示该标识符是数组的名称;再与左边的“∗”号相结合,表示该数组的元素是指针类型的数据。

区分数组指针,例如:

前一个p 是包含10 个指针变量元素的数组;后一个p 是指针变量,指向一个包含10 个元素的一维数组。

7.指向指针的指针

指向的指针:首先是一个指针类型变量,该变量所指的对象又是一个指针变量,称为“二级指针”。二级指针的定义格式为:

类型标识符 * * 二级指针变量;

定义后需要把另一个指针变量的地址赋值给二级指针变量,格式为:

二级指针变量=&一级指针变量;

例如:

设置二级指针变量的目的并非针对其直接指向的指针变量进行处理,最终还是要对所指指针变量指向的数据变量进行操作,因此要用二级指针引用数据变量,形式是:

* * 二级指针变量名;

例如,用p2 表示变量a 的形式是∗∗p2,∗p2 表示二级指针p2 所指的对象p1,因为p1是一级指针变量,所以∗p2 仍然是地址,再对∗p2 进行指针运算形成∗∗p2,才表示p1 所指的对象整型变量a。

8.返回指针的函数

如果一个函数要返回指针类型值,就要在定义这个函数的函数头部时,对它的返回类型进行具体的定义,格式为:

返回类型标识符 * 函数名(形式参数表)

9.指向函数的指针

“指向函数的指针变量”是指存放函数指针的特殊指针变量。指向函数的指针变量与其他指针变量有着本质的不同:其他指针变量指向的是参与运算的操作数据,目的在于引用其指向的数据;而指向函数的指针变量指向的是函数,目的是通过指针变量来调用所指向的函数。

①定义:类型标识符(∗指针变量名)(形参表)。

②赋值:指针变量名=函数名。

③使用:(∗指针变量名)(实参表)。

选择题

1.若有以下定义和语句,且0≤i<10 则对数组元素的错误引用是( )。

A.∗(a+i) B.a[p-a] C.p+i D.∗(&a[i])

2.若有定义“int a[3][4];”,( )不能表示数组元素a[1][1]。

A.∗(a[1]+1) B.∗(&a[1][1])

C.(∗(a+1)[1]) D.∗(a+5)

3.对如下定义,以下说法中正确的是( )。

char * a[2]={ "abcd","ABCD"};

A.数组a 的元素值分别为"abcd"和"ABCD"

B.a 是指针变量,它指向含有两个数组元素的字符型数组

C.数组a 的两个元素分别存放的是含有4 个字符的一维数组的首地址

D.数组a 的两个元素中各自存放了字符'a'、'A'的地址

4.char ∗s=" \ t\ \ Name\ \ Address\n";

指针s 所指字符串的长度为( )。

A.说明不合法 B.19 C.18 D.15

5.分析下面函数,以下说法正确的是( )。

A.交换∗p1 和∗p2 的值 B.正确,但无法改变∗p1 和∗p2 的值

C.交换∗p1 和∗p2 的地址 D.可能造成系统故障

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈