理解程序思想C语言中特有的指针该怎么定

北京中科白颠疯 https://baike.baidu.com/item/北京中科白癜风医院/9728824

指针变量的定义与引用

1)指针变量的定义

指针变量的定义格式为:

存储类型 类型标识符 *指针变量名

其中,指针变量名前加了“*”号表示该变量是指针变量,而“类型标识符”表示该指针变量所指向的变量的类型。指针存储类型是指该变量的存储属性。与普通变量一样,不同存储类型的指针使用不同的存储区。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个指针变量,它既能指向一整型变量又能指向双精度变量。

例如:

char*pc1,*pc2;

int*pa,*pb;

float*px,*py;

表示定义了6个指针变量pc1、pc2、pa、pb、px、py。pc1可以指向一个字符型变量,pa可以指向一个整型变量,px可以指向一个实型变量,换句话说,pc1、pa、px可以分别存放字符型变量的地址、整型变量的地址、实型变量的地址,定义形式如表6.3所示。

常用的指针变量定义形式

2)指针运算符

在C++语言中有两个有关指针的特别运算符:

&运算符:

取地址运算符,&a的值为a的地址。如表6.2中,&a的值为。

*运算符:

指针运算符或指向运算符,也称间接运算符,*pa代表pa所指向的变量。如表6.2中,*pa的值为1(即变量a的值)。

3)指针变量的引用

定义了一个指针变量之后可以对该指针变量进行各种操作,例如给一个指针变量赋予一个地址值。输出一个指针变量的值。访问指针变量所指向的变量等。常用的指针变量的使用方法见表。

常用的指针变量的使用方法

注:在指针引用前要对它进行初始化,只有给指针赋初值后才可引用指针。

4)指针初始化

对于静态存储指针变量,其自动初始化为NULL,即0,该指针不指向任何有效数据单元,有时也称指针为空指针,如:

其中pa、pb初始化为NULL。

对于动态存储指针变量,可以对其赋值,也可以在定义指针变量时初始化,就像普通变量定义时初始化一样,还可以用new操作符分配动态内存,如:

5)附加说明

在指针变量的定义和指针变量的引用中都有*pa,但此处的*pa与定义指针变量时用的*pa是有区别的,它们形式上有些相似,而含义是不同的。在定义时“int*pa”中的“*”不是运算符,它只是表示其后面的变量是一个指针类型的变量。而在程序的执行语句中引用的“*pa”,其中的“*”是一个指针运算符,*pa表示“pa指向的变量”,如表6.2所示的那样,pa已指向整型变量a,则*pa就代表整型变量a,因此下面两个语句作用相同:

*pa=;

a=;

运行时都以地址为的整型单元赋值为。

6.1.3 指针的运算

指针的运算是以指针变量所持有的地址值为运算量进行的运算。因此,指针运算的实质是地址的计算。C++语言具有自己的地址计算方法,它是一套适用于指针、数组等地址计算的始终一贯的规则化方法。正是这些方法赋予了C++语言功能较强、速度灵活的数据处理能力。

由于指针具有持有地址量的变量这一特性,指针的运算与普通变量的运算在种类上和意义上都是不同的。指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。

指针的算术运算是按C++语言地址计算规则进行的,这种运算与指针指向的数据类型有密切关系,也就是C++语言的地址计算与地址中存放的数据长度有关。

设:pa和pb是指向具有相同数据类型的一组若干数据的指针,n是整数,则指针可以进行的算术运算有如下几种:

pa+n,pa-n,pa++,++pa,--pa,pa-pb

超实用性的Python零基础入门到进阶视频源码淘宝¥2购买已下架

1)指针与整数的算术加减运算

指针作为地址量加上或减去一个整数n,其意义是指针当前指向位置的前方或后方第n个数据单元的位置。由于指针可以指向不同数据类型,即数据长度不同的数据单元,因此这种运算的结果值取决于指针指向的数据类型。表6.5是不同数据类型的指针实行加减整数运算的示意。

表 不同数据类型的指针实行加减整数运算

表中指针pc指向char型数据单元,它加上1时,实际结果是指针的地址量加1;指针pi指向short型数据单元,它加上1时,实际结果是指针的地址量加2;指针p1指向long型数据单元,它加上1的结果是指针本身的地址值加4。对于某指针p,若其指向某数据类型T,则p+/-n表示的实际位置的地址值是:

valueof(p)+n*sizeof(T)

注:其中valueof(p)表示指针p的地址值。

*(pc+1)表示指针pc加1后所指向地址的目标变量。

2)指针自增、自减运算

指针自增、自减运算也是地址计算,它具有上述的计算特点,指针自增、自减运算是指针本身地址值的变化。指针“++”运算后指向了下一个数据单元的位置,“--”运算后就指向上一个数据单元的位置。运算后指针地址值的变化量取决于它指向的数据类型。例如,在表6.5中指针pi指向int型,设pi为4,则pi++为6,pi--为2。

指针自增、自减运算也分为前置运算和后置运算,当它们和其他运算出现在一个表达式中时,要注意它们之间的结合规则和运算顺序。例如:

3)指针的相减

设指针pa和pb是指向同一数据类型T一致的数据,则pa-pb运算的结果值是两指针指向的地址位置之间的数据单元个数。由此可以看出,两指针相减实质上也是地址计算。它执行的运算不是两指针持有的地址值相减,而是按下列公式得出结果,为一个整数。即:

(valueof(pa)-valueof(pb))/sizeof(T)

其中,valueof(pa)表示指针pa的地址值。

4)关系运算

两个指向同一组类型相同数据的指针之间可以进行各种关系运算。两指针之间的关系运算表示它们指向的地址位置之间的关系。假设数据在内存中的存储逻辑是由前向后,那么指向后方的指针大于指向前方的指针。对于两指针pa和pb间的关系表达式:

pa<pb

若pa指向位置在pb指向位置的前方,则该表达式的结果值为1,反之为0。两指针相等的情况是两指针指向同一位置。

若两个指针变量pa和pb指向同一数组,当pa==pb为真时,表示pa、pb指向数组的同一元素;若pa<pb为真时,则表示pa所指向的数组元素在pb所指向的数组元素之前。

指向不同数据类型的指针之间的关系运算是没有意义的。指针与一般整数变量之间的关系运算也是无意义的,但是指针可以和零之间进行等于或不等于的关系运算,即:

p==0或p!=0

它们用于判断指针p是否为一空指针。

5)赋值运算

向指针变量赋值时,赋的值必须是地址常量或变量,不能是普通整数。指针赋值运算常见的有以下几种形式:

(1)把一个变量的地址赋给一个指向同一数据类型的指针,例如:

charc,*pc;

pc=&c;

(2)把一个指针的值赋给指向同一数据类型的另一个指针,例如:

int*pa,*pb;

pa=pb;

(3)把数组的地址赋给指向同一数据类型的指针。例如:

charaddress[80],*paddress;

paddress=address;

(4)此外,还经常使用下列赋值运算:

int*pa,*pb,n;

pa=pb+n:

pa=pb-n;

pa+=n;

pa-=n;

好了,本文到此结束。如果对编程、计算机、程序员方面感兴趣的话,欢迎私信联系我,随时交流!点个


转载请注明:http://www.aierlanlan.com/cyrz/2055.html