(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.可能造成系统故障
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。