C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计
“ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 指针与函数 指针与字符串 指针 void类型指针 指针与数组 动态内存 指针与结构体 指针 动态内存 引用 void类型指针 内存泄漏与悬挂指针 C++语言程序设计
基本知识 a C++语言程序设计
6.1 指针 关于变量(复习) 定义变量 变量的类型:指定了数据的表示和处理方法 变量的地址:内存单元的地址,指出变量在内存中的位置 例如:char ch1=‘Y’; 变量的类型:指定了数据的表示和处理方法 变量的地址:内存单元的地址,指出变量在内存中的位置 变量的值:内存单元的内容 变量名:内存单元的名字 使用变量名可以直接存取变量的值——直接访问 例如:ch1=‘A’; cout<<ch1<<endl; C++语言程序设计
6.1 指针 指针变量(简称为指针,Pointer) 用来存放其它变量的地址或者是内存单元的地址的变量 访问指针变量时,只能看到地址 通过这个地址,能访问该地址单元中的内容——间接访问 C++语言程序设计
6.1 指针 例如: 关于指针 指针变量pch1中存放着字符型变量ch1的地址 建立了pch1和ch1的指向关系:pch1指向ch1 指针是用于指向目标数据对象的 指针提供了对它所指向的目标数据对象的间接访问 C++语言程序设计
6.1 指针 指针变量的定义 格式:<类型名> *变量名1, *变量名2; “*”:声明变量是指针变量 指针的类型:是它所指向的目标数据对象的类型 例如:int *pa1,*pa2; 定义了指向整型数据的指针变量pa1、pa2 (int *)型:说明变量pa1、pa2的类型是整型指针,即指向整型变量 的指针 C++语言程序设计
6.1 指针 指针变量的初始化 定义指针变量时初始化 定义指针变量后赋值 “先初始化,后使用”是指针变量使用的一条基本原则 指针变量必须在初始化后才可以正确使用 初始化是指给它分配一个有效的数据地址 定义指针变量时初始化 例如: int a1=10; int *pa1=&a1; “&”:取地址运算符,可以获取变量的地址 定义指针变量后赋值 例如:int *pa1=0; int a1=10; pa1=&a1; 建议:在定义指针变量时,如果不确定指针的指向,应赋值为 0 或 NULL,表示不指向任何内存单元(空指针) C++语言程序设计
6.1 指针 例:观察指针的值和指针变量自身的地址 C++语言程序设计 //指针变量 #include<iostream> using namespace std; int main() { short int a=10; short int *pa=&a; cout<<“a的地址:”<<&a<<endl; cout<<“pa的值:”<<pa<<endl; cout<<“pa的地址:”<<&pa<<endl; cout<<“指针变量pa的长度:”<<sizeof(pa)<<“字节”<<endl; return 0; } C++语言程序设计
使用指针变量间接访问它所指向的目标数据对象 6.1 指针 使用指针变量间接访问它所指向的目标数据对象 使用取地址运算符“&”可以获取变量的地址 格式:&变量名 和变量连用,获取变量所对应的内存单元的地址 用指针来访问它所指向的变量,必须使用间接引用运算“*” 格式: *指针变量名 和指针变量连用,获取指针所指向的目标数据对象 例如:int a1=100; int *pa1=&a1; *pa1=200; //这里的*pa1 就可以看做是变量 a1 C++语言程序设计
6.1 指针 例:对变量的直接访问和间接访问 C++语言程序设计 //对变量的直接访问和间接访问 #include <iostream> using namespace std; void main() { char ch1='a',*pch=0; int k1=100; pch=&ch1; //指针pch指向变量ch1 cout<<"*pch="<<*pch<<endl; //间接访问 *pch='B'; cout<<"ch1="<<ch1<<endl; //直接访问 ch1=k1; cout<<"*pch="<<*pch<<endl; //间接访问 } C++语言程序设计
6.1 指针 指针的算术运算 指针可以和一个整数n做加法或者减法运算 提示:指针的算术运算和一般的数学算术运算有不同的含义。 例如: 例如:设p为指向数组中某元素的指针 p+n:指针指向p后方第n个元素 p-n:指针指向p前方第n个元素 指针的(++)和(--)运算 运算后,指针向其后方或前方的元素 指针相减 运算结果为其间元素个数 提示:指针的算术运算和一般的数学算术运算有不同的含义。 例如: pa+1:因为pa指向的目标数据的类型是短整型,所以实际计算出的指针值是: pa的值加2 pb+1:因为pb指向的目标数据的类型是整型,所以实际计算出的指针值是: pb的值加4 指针的算术运算和指针所指向的目标数据对象的类型有关 C++语言程序设计
6.1 指针 例:通过指针的间接访问, 输出下标为偶数的数组元素的值 C++语言程序设计 数组第一个元素(下标为0)的地址赋值给指针pk //指针运算 #include <iostream> using namespace std; void main() { int k1[10]={11,24,37,44,58,66,79,86,93,108},*pk=NULL; pk=&k1[0]; //数组第一个元素的地址赋值给指针pk for(int i=0;i<10;i=i+2) //每次循环,指针加2 cout<<"k1["<<i<<"]="<<*(pk+i)<<endl; } 每次循环,指针加i C++语言程序设计
6.1 指针 指针的关系运算 相同类型的指针可以进行各种关系运算 例如:可以测试两个指针是否相等 如果相等,则表示它们指向同一个目标数据对象 例如:使用指针进行间接访问之前,可以测试它是否已指向有效的目标数据 if(p!=0) 或者 if(p) //如果指针p的值不为0(NULL) if(p==NULL) 或者 if(!p) //如果指针p的值为0(NULL) C++语言程序设计
6.1 指针 指针的赋值运算 指针的赋值运算一定是地址的赋值 用来对指针变量赋值的可以是: 同类型变量的地址 同类型的已经初始化的指针变量或者同类型的指针常量 向系统申请的同类型动态数据的地址 0 或NULL 注意:不同类型的指针是不可以互相赋值的。在指针赋值时,不存在类型自动转换的机制。 C++语言程序设计