C++言程序设计 第六章指针 第6章指针 ※6.1指针的基本概念 ※6,2指针与数组 ※63指针与函数 ※6.4引用
C++语言程序设计 第六章 指针 第6章 指针 ※6.1 指针的基本概念 ※ 6.2指针与数组 ※ 6.3 指针与函数 ※ 6.4 引用
C++播言程序设计 第六章指针 61指针的基本概念c有在程序运行时获得变量的地址 和操纵地址的能力,这种用来操纵地 址的特殊类型变量就是指针。 61。1指针的概念 在计算机中,内存是按字节编址的,一个字节就是一个基 本的存储单位,称为存储单元。每个存储单元都有一个编号 这个编号就称为该存储单元的“地址”。按地址可以找到相 应的存储单元进而对该存储单元的数据进行存取操作。因此 系统对数据的存取最终是通过内存单元的地址进行的
C++语言程序设计 第六章 指针 6.1指针的基本概念 C++有在程序运行时获得变量的地址 和操纵地址的能力,这种用来操纵地 址的特殊类型变量就是指针。 6.1.1指针的概念 在计算机中,内存是按字节编址的,一个字节就是一个基 本的存储单位,称为存储单元。每个存储单元都有一个编号, 这个编号就称为该存储单元的“地址” 。按地址可以找到相 应的存储单元进而对该存储单元的数据进行存取操作。因此 系统对数据的存取最终是通过内存单元的地址进行的
C++语言程序设计 第六章指针 00654000H 变量a 00654001H 00654002H 00654003H 00654004H 变量b 00654005H 00654006H 00654007H 如下语句: 00654008H int a= 3: int b= 4 图61变量的存储 则系统给整型变量a、b分别分配4个字节作为它们的存储空间,如图6.1所示,系统分配 00654000H~00654003H四个字节给变量a,00654004H~00654007H字节给b。我们说变量a 的地址是00654000H,地址00654000H指向的存储空间中存放的是数据3,也就是存储空间的 内容为3,即a的值。同样b的地址为00654004H 注意在内存中并不存在变量名,对变量值的存取都是通过地址进行的。 所谓指针,就是一个变量的地址,是一个常量。如变量的地址是00654000H,则00654000H 就是变量a的指针
C++语言程序设计 第六章 指针 图6.1 变量的存储 3 4 00654000H 00654001H 00654002H 00654003H 00654004H 00654005H 00654006H 00654007H 00654008H 变量a 变量b 如下语句: int a = 3; int b = 4; 则系统给整型变量a、b分别分配4个字节作为它们的存储空间,如图6.1 所示,系统分配 00654000H~00654003H四个字节给变量a,00654004H~00654007H字节给b。我们说变量a 的地址是00654000H,地址00654000H指向的存储空间中存放的是数据3,也就是存储空间的 内容为3,即a的值。同样b的地址为00654004H。 注意在内存中并不存在变量名,对变量值的存取都是通过地址进行的。 所谓指针,就是一个变量的地址,是一个常量。如变量a的地址是00654000H,则00654000H 就是变量a的指针
C++语言程序设计 第六章指针 612指针变量的定义 由于指针变量是一个变量,所以它具有和普通变量一样的属性,即指针变量 也有一定的存储类型、数据类型和使用范围。因此,在使用指针变量之前, 必须对指针变量进行定义,以说明该指针变量的性质。 指针变量定义的一般形式为: 存储类型数据类型*标识符; “标识符”就是指针变量名。例如下面语句定义了名字为p和q的两个不同类 型的指针变量: int*p; float*q 标识符前的“*”,表示其后的名字是一个指针变量名。在本例中,指针变 量名是p和q,而不是*p和*q。C艹中,在定义指针变量时,以下形式均为1 法的: int*p;∥*靠左 float*q;∥两边都不靠
C++语言程序设计 第六章 指针 6.1.2指针变量的定义 由于指针变量是一个变量,所以它具有和普通变量一样的属性,即指针变量 也有一定的存储类型、数据类型和使用范围。因此,在使用指针变量之前, 必须对指针变量进行定义,以说明该指针变量的性质。 指针变量定义的一般形式为: 存储类型 数据类型 * 标识符; “标识符”就是指针变量名。例如下面语句定义了名字为p和q的两个不同类 型的指针变量: int *p; float*q; 标识符前的“*” ,表示其后的名字是一个指针变量名。在本例中,指针变 量名是p和q,而不是*p和*q。C++中,在定义指针变量时,以下形式均为合 法的: int* p; // *靠左 float* q; // *两边都不靠
C++语言程序设计 第六章指针 61.3指针变量运算符 有两个与指针变量有关的运算符&和*,下面对它们进行介绍 并说明它们之间的关系 1.取地址运算符: 该运算符表示的是对“&”后面的变量进行取地址运算 2.指针运算符:* 该运算符也叫“取内容运算符”,它后面必须是一个指针变 量。表示的是访问该指针变量所指向的变量,即访问指针所 指向的存储空间中的数据
C++语言程序设计 第六章 指针 6.1.3指针变量运算符 有两个与指针变量有关的运算符&和*,下面对它们进行介绍 并说明它们之间的关系 1. 取地址运算符:& 该运算符表示的是对“&”后面的变量进行取地址运算 2. 指针运算符:* 该运算符也叫“取内容运算符” ,它后面必须是一个指针变 量。表示的是访问该指针变量所指向的变量,即访问指针所 指向的存储空间中的数据
C++语言程序设计 第六章指针 个指针变量p在程序中通常有如下表示形式: p—指针变量,它的内容是地址量; p一指针所指向的变量,是指针所指向的内存空间中的数据; &p-指针变量所占存储空间的地址。 #include cout<<a=<<a<<endI: void maino cout<<p="<<p<<endl; cout<<&a='<<&a<<endl int a=10: cout<<"*p”<<p<endl; Int *p; cout<<"&p=<<&p<<endl; p=&a; cout<< a=w<<as<endl 运行结果为 cout<<"p"<<p<<endl; a=10 P=0x0065 FDF4 cout<<*p<<"p<<endl &a=0x0065FDF4 cout<<"&p="<<&p<<endl; p=10 cout<<endl; *p=15; &p=0x0065FDF0 a=15 P0x0065FDF4
C++语言程序设计 第六章 指针 一个指针变量p在程序中通常有如下表示形式: p — 指针变量,它的内容是地址量; *p一 指针所指向的变量,是指针所指向的内存空间中的数据; &p一 指针变量所占存储空间的地址。 #include void main() { int a=10; int *p; p=&a; cout<<"a="<<a<<endl; cout<<"p="<<p<<endl; cout<<"&a="<<&a<<endl; cout<<"*p="<<*p<<endl; cout<<"&p="<<&p<<endl; cout<<endl; *p=15; cout<<"a="<<a<<endl; cout<<"p="<<p<<endl; cout<<"&a="<<&a<<endl; cout<<"*p="<<*p<<endl; cout<<"&p="<<&p<<endl; } 运行结果为: a=10 p=0x0065FDF4 &a=0x0065FDF4 *p=10 &p=0x0065FDF0 a=15 p=0x0065FDF4
C++语言程序设计 第六章指针 614指针的初始化与赋值 指针初始化的一般形式为: 存储类型数据类型*指针变量名=初始地址量; 例如: Int a int *p=&a 上述语句在定义p指针的同时,把整型变量a的地址作为初值 赋给了整型指针p,从而使p指向了变量a的存储空间。“*” 号仅是一个标记,说明p是一个指针变量,在定义的同时将a 的地址赋予了指针变量p。还可以写成以下语句形式: inta,’p=&a;
C++语言程序设计 第六章 指针 6.1.4指针的初始化与赋值 指针初始化的一般形式为: 存储类型 数据类型 * 指针变量名=初始地址量; 例如: int a; int *p=&a; 上述语句在定义p指针的同时,把整型变量a的地址作为初值 赋给了整型指针p,从而使p指向了变量a的存储空间。 “*” 号仅是一个标记,说明p是一个指针变量,在定义的同时将a 的地址赋予了指针变量p。还可以写成以下语句形式: int a,*p=&a;
C++语言程序设计 第六章指针 为明确表示指针变量不指向任何变量,在C++语言中用0值给指针变量赋值表示 这种情况,记为NULL。例如 int*p=NUL;或int*p=0; 指针值为0的指针变量为空指针。对于静态的指针变量,如在定义时未给它指定 初值,系统自动给它指定初值为0。空指针并不是指针存储空间为空的意思,这 里的0也不是数值的0,而是NULL字符的ASC码值。空指针不表示任何指向, 而是表示指针的一种状态,它在程序中经常作为一种状态标志使用。 另外,指针变量对所指对象也有类型限制,不能将一个其他对象的地址赋给指针 变量。如有以下定义: int i= 100, j, *ip, *intp; float f, *fp; &i 以下都是不正确的赋值 ip=100;∥指针变量不能赋整数值 intp=j;∥指针变量不能赋整型变量的值 fp= & ∥能指向 float型变量的指针变量,不能指向int型变量 fp=ip;∥两种指向不同类型变量的指针变量不能相互赋值
C++语言程序设计 第六章 指针 为明确表示指针变量不指向任何变量,在C++语言中用0值给指针变量赋值表示 这种情况,记为NULL。例如 int *p = NULL; 或int * p = 0; 指针值为0的指针变量为空指针。对于静态的指针变量,如在定义时未给它指定 初值,系统自动给它指定初值为0。空指针并不是指针存储空间为空的意思,这 里的0也不是数值的0,而是NULL字符的ASCII码值。空指针不表示任何指向, 而是表示指针的一种状态,它在程序中经常作为一种状态标志使用。 另外,指针变量对所指对象也有类型限制,不能将一个其他对象的地址赋给指针 变量。如有以下定义: int i = 100, j, *ip, *intpt; float f, *fp; ip = &i; 以下都是不正确的赋值: ip = 100; // 指针变量不能赋整数值 intpt = j; // 指针变量不能赋整型变量的值 fp = &i; // 能指向float型变量的指针变量,不能指向int型变量 fp = ip; // 两种指向不同类型变量的指针变量不能相互赋值
C++语言程序设计 第六章指针 615指针的运算 1指针的算术运算 指针的算术运算只有两种:加和减。设p和q是指向具有相同类型的一组数据的指针,数据的 排列是由前向后的,n是整数,则指针可以进行的算术运算有如下几种 p+n p-n p++++p p---p p-q (1)指针与整数的加减运算 (2)指针加1、减1运算 (3)指针的相减 2.指针的关系运算 两个指针进行关系运算时,它们必须指向同一数据类型,指针的关系运算表示它们所指 向的变量在内存中的位置关系。由于数据在内存中的存储顺序是由前向后,若指针p和q 指向同一类型的数据,则指针的关系运算如表62所示。 应注意,在指向不同数据类型的指针之间进行关系运算是没有意义的,指针与一般整数 常量或变量之间进行关系运算也是没有意义的。但指针与整数0之间可进行等或不等的关 系运算,即 p==0; 或 p!=0 用于判断指针是否为空指针
C++语言程序设计 第六章 指针 6.1.5指针的运算 1.指针的算术运算 指针的算术运算只有两种:加和减。设p和q是指向具有相同类型的一组数据的指针,数据的 排列是由前向后的,n是整数,则指针可以进行的算术运算有如下几种: p+n p-n p++ ++p p-- --p p-q (1)指针与整数的加减运算 (2)指针加1、减1运算 (3) 指针的相减 2.指针的关系运算 两个指针进行关系运算时,它们必须指向同一数据类型,指针的关系运算表示它们所指 向的变量在内存中的位置关系。由于数据在内存中的存储顺序是由前向后,若指针p和q 指向同一类型的数据,则指针的关系运算如表6.2所示。 应注意,在指向不同数据类型的指针之间进行关系运算是没有意义的,指针与一般整数 常量或变量之间进行关系运算也是没有意义的。但指针与整数0之间可进行等或不等的关 系运算,即 p==0; 或 p!=0 用于判断指针是否为空指针
C++语言程序设计 第六章指针 【例64】指针的关系运算 include void main( int a=10, b=10, ptr1, ptr 2 ptr1=&a ptr2=&b; cout<<ptr1==*ptr 2 <<endl cout <<(ptr1==ptr 2 <<endl 运行结果为
C++语言程序设计 第六章 指针 【例6.4】 指针的关系运算 #include void main( ) { int a=10,b=10,*ptr1,*ptr2; ptr1=&a; ptr2=&b; cout<<(*ptr1==*ptr2)<<endl; cout<<(ptr1==ptr2)<<endl; } 运行结果为 1 0