指针的定义和应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前一页
休息
35
字符指针的定义、赋值和引用--例5
#include <iostream> #include <string> using namespace std; void main ( ) { char *p,sa[20],sb[20]; int i; p=sa; strcpy (sa,“Today is Sunday.”); for (i=0;*(sa+i)!=‘\0’;i++) sb[i]=*p+ +; sb[i]=‘\0’; p=sb; cout<<p; }
前一页 休息 12
指针与地址运算符
“ &”在执行语句中作为取地址运算符,它是一元运 算符,返回操作数的地址,操作数必须是变量名。 “*”除了可以在声明语句中声明指针时使用外, 还可以在执行语句中作为为指针运算符使用,也称 为“间接访问”运算符,指针运算符是一元运算符, 指针运算符 * 表示指针所指向的变量的值。
前一页 休息 31
cout<<"输入数组a中元素的个数:"<<endl; cin>>d; cout<<"输入数组a的"<<d<<"个元素:"<<endl; for(pa=a;pa<a+d;pa++) cin>>*pa; cout<<"输入数组b中元素的个数:"<<endl; cin>>e; cout<<"输入数组b的"<<e<<"个元素:"<<endl; for(pb=b;pb<b+e;pb++) cin>>*pb;
前一页 休息 19
short *pa
pa-2 pa-1 *(pa-2) *(pa-1)
pa
pa+1 pa+2 pa+3
*pa
*(pa+1) *(pa+2)
*(pa+3)
前一页
休息
20
int *pb
pb-1 *(pb-1) pb *pb pb+1 *(pb+1) pb+2 *(pb+2)
前一页
休息
前一页 休息 37
动态申请内存操作符 new
<指针>= new <类型> <指针>= new <类型> (<初值>) 功能:在程序执行期间,申请用于存放 类型对象的内存空间,并依初值列表 赋以初值。 结果值: 成功:类型的指针,指向新分配的内存 首地址。 失败:0(NULL)
21
指针变量的关系运算
关系运算
两个指针变量指向同一个数组中的元 素时,其关系运算的结果表明了这两个 指针变量所指向的数组元素的先后关系 指针可以和零之间进行等于或不等于 的关系运算。例如:p==0或p!=0
前一页
休息
22
指针的关系运算
例如: char a[10] ; char *p1,*p2; p1=a+2; p2=a+4;
前一页 休息 32
for(pa=a,pc=c;pa<a+d;pa++,pc++) { *pc=*pa; f++;} for(pb=b;pb<b+e;pb++) { for(pa=a;pa<a+d;pa++) if(*pb==*pa) break; if(pa>=a+d) { *pc++=*pb; f++;} } cout<<“并集c的各个元素依次为:"<<endl; for (pc=c;pc<c+f;pc++) cout<<setw(3)<<*pc; }
休息 36
前一页
动态存储分配
静态存储分配: 程序中使用的变量和数组的类型、数目、大小 是由编写程序时确定的,程序运行时这些数据占 用的存储空间数也是一定的。 缺点:程序无法在运行时根据具体情况(如用户 输入)灵活调整存储分配情况。 动态存储分配: 使用指针、运算符new和delete,在程序运行 期间按照实际需要申请适量内存,克服了静态存 储分配的缺点。
前一页 休息 17
程序运行的结果是: Output int i=10 Output int pointer i=10
前一页
休息
18
指针变量的算术运算
指针与整数的加减运算 –指针 p 加上或减去 n ,其意义是 指针当前指向位置的前方或后方第 n 个数据的地址。 –这种运算的结果值取决于指针指向 的数据类型。 指针加一,减一运算 –指向下一个或前一个数据。
前一页 休息 30
应用举例4
从键盘输入整数集合a、b的元素个 数和各个元素的值,计算并输出其并集
#include <iostream> #include <iomanip>
using namespace std;
void main( ) { const int M=20,N=10; int a[M],b[N],c[M+N]; int d,e,f=0,*pa,*pb,*pc;
什么是地址?
计算机的内存储器就象一个巨大的一 维数组, 每个数组元素就是一个存储 单元(在微型计算机中其大小通常为 一个字节)。 就象数组中的每个元素都有一个下标 一样, 每个内存单元都有一个编号, 又 称地址。
前一页
休息
3
什么是地址?
在运行一个程序时, 程序本身及其所 用到的数据都要放在内存储器中:程 序、函数、变量、常数、数组和对象 等, 在内存储器中占有一席之地。 存放在内存储器中的程序和数据都有 一个地址, 用它们占用的那片存储单 元中的第一个存储单元的地址表示。
前一页 休息 14
指针变量的赋值运算
指针变量=地址 p = &a;
p=array;//将数组的首地址赋值给p p= &array[i]; //将数组的第i个元 素的地址赋值给p p = max;//将函数max的入口地址赋 给p p1=p2;//将指针p2的值赋个指针p1
前一页 休息 15
前一页 休息 29
for(pa=a,pc=c;pa<a+d;pa++) for(pb=b;pb<b+e;pb++) if(*pa==*pb) {*pc++=*pa; f++; break; } cout<<"交集c的各个元素依次为:"<<endl; for (pc=c;pc<c+f;pc++) cout<<setw(3)<<*pc; }
前一页 休息 33
字符指针来存储和处理字符串
字符指针与字符串 字符串是由字符数组中的结束 标志符“\0”之前的字符组成的 特殊数组,指向这一特殊数组 的指针则称字符串指针。字符串 指针的定义、赋值和引用与指向 数组的指针基本相同
前一页 休息 34
用字符数组存储和处理字符串
注意!若有如下定义: char a[4] =“abc”, *p2=a; cin>>p2; 正确的 // 等价于cin>>a;
① 定义语句中的“*”表示该变量为指针变量 ② 一个指针变量只能存储同一种类型变量的地址
前一页
休息
10
指针变量的初始化
语法形式
类型标识符 * 指针名=初始地址;
例: int * pa=&a;
前一页
休息
11
指针变量的初始化
注意事项
用变量地址作为初值时,该变量必须在指 针初始化之前定义。 如:int a; int * pa=&a; 已赋初值的指针可以初始化另一 个指针变 量。 int * pa=&a; int * pb; pb=pa;
休息 16
前一页
例1 指针的定义、赋值与使用
#include<iostream> using namespace std; void main( ) { int *i_pointer; int i; i_pointer=&i; i=10; cout<<“Output int i=”<<i<<endl; cout<<"Output int pointer i="<<*i_pointer<<endl; }
指针变量的赋值运算
指针变量=地址 不能把常量或表达式的地址赋给指针变量。 如:P=&67;P=&(i+5)是非法的 不能将一个整数赋给指针变量,但可以赋整 数值0,表示该指针空指针,不指向任何内容。 指针的类型是它所指向变量的类型。
允许声明指向 void 类型的指针。该指针可 以被赋予任何类型对象的地址。 例: void *general;
前一页
休息
4
什么是地址?
在C++中,为某个变量或者函数分配 内存储器的工作由编译程序完成。 内存地址的访问方式 – 直接访问方式:通过变量名访问 – 间接访问方式:通过地址访问
前一页
休息
5
如何知道某个变量、数组、函数的地址
C++规定: 变量的地址可以使用地址运算符&求 得。例如, &x表示变量x的地址; 数组的地址, 即数组第一个元素的地 址, 可以直接用数组名表示; 函数的地址用函数名表示。
前一页 休息 28
cout<<"输入数组a中元素的个数:"<<endl; cin>>d; cout<<"输入数组a的"<<d<<"个元素:"<<endl; for(pa=a;pa<a+d;pa++) cin>>*pa; cout<<"输入数组b中元素的个数:"<<endl; cin>>e; cout<<"输入数组b的"<<e<<"个元素:"<<endl; for(pb=b;pb<b+e;pb++) cin>>*pb;
C++编程导论
第15章 指 针
西南交通大学软件学院 计算机基础教研室
本章主要内容
C++中指针的基本概念 指针类型变量的定义方法 指针与地址运算符 指针变量赋值、指针的运算 通过指针类型的变量去访问某个变量或数组元 素的值 引用 动态分配内存 按引用调用
前一页 休息 2
指针变量的概念
内存用户数据区
定义 例:int i; int * i_pointer;
指向整型
变量的指针
2000 2004
3 6
变量 i 变量 j
3010
2000
变量 i_pointer
前一页
休息
9
指针变量的声明
变量的指针:变量在内存中的存放起始地址 指针变量的声明:
类型标识符* 指针变量
例如:int* p;
前一页 休息
25
应用举例2
设有一个int型数组a,有10个元素。用 四种方法访问数组的各个元素:
使用数组名和下标 使用数组名和指针运算 使用指针变量 使用下标表示法引用指针指向的数 组元素
前一页 休息 26
#include <iostream> using namespace std; void main( ) { int a[10]; int i,*p; for(i=0; i<10; i++) cin>>a[i]; for(i=0; i<10; i++) cout<<*(a+i); for(p=a; p-a<10; p++) cout<<*p; p=a; for(i=0; i<10; i++) cout<<p[i]; 前一页 } 休息
前一页 休息 6
什么是指针
指针是C++语言中的一种数据类型, 是专门用来处理地址的。 指针是某个内存单元的首地址。
前一页
休息
7
什么是指针变量?
指针变量是包含另一个变量地址的变 量。
指针变量也是一个变量,遵循先定义, 后使用。 定义指针变量的类型是由该指针指向 的变量类型决定。
前一页 休息 8
27
应用举例3
从键盘输入整数集合a、b的元素个 数和各个元素的值,计算并输出其交集
#include <iostream> #include <iomanip>
using namespace std;
void main( ) { const int M=20,N=10; int a[M],b[N],c[M]; int d,e,f=0,*pa,*pb,*pc;
p1++;p2--;
前一页
休息
23
指向数组元素的指针
定义与赋值 例: int a[10], *pa; pa=&a[0]; 或 pa=a;
前一页
休息
24
பைடு நூலகம் 指向数组元素的指针
通过指针引用数组元素
经过上述声明及赋值后,在执行语句中
*pa就是a[0],*(pa+1)就是a[1],... , *(pa+i)就是a[i]. a[i], *(pa+i), *(a+i), pa[i]都是等效的。 不能写 a++,因为a是数组首地址是常 量。
–&a:取变量a的地址。 –*a:指针变量所指向的变量的值。
–int
前一页 休息
y=5; int* p; p=&y;cout<<*p;
13
指针与地址运算符
*出现在声明语句和执行语句中 的含义是不同的。 int* p; // *在声明语句中表 示声明的是指针,声明p是整型指 针 cout<<*p; // *在执行语句中表 示指针所指对象的内容