指针的定义和应用
前一页 休息 33
字符指针来存储和处理字符串
字符指针与字符串 字符串是由字符数组中的结束 标志符“\0”之前的字符组成的 特殊数组,指向这一特殊数组 的指针则称字符串指针。字符串 指针的定义、赋值和引用与指向 数组的指针基本相同
前一页 休息 34
用字符数组存储和处理字符串
注意!若有如下定义: char a[4] =“abc”, *p2=a; cin>>p2; 正确的 // 等价于cin>>a;
前一页 休息 12
指针与地址运算符
“ &”在执行语句中作为取地址运算符,它是一元运 算符,返回操作数的地址,操作数必须是变量名。 “*”除了可以在声明语句中声明指针时使用外, 还可以在执行语句中作为为指针运算符使用,也称 为“间接访问”运算符,指针运算符是一元运算符, 指针运算符 * 表示指针所指向的变量的值。
什么是地址?
计算机的内存储器就象一个巨大的一 维数组, 每个数组元素就是一个存储 单元(在微型计算机中其大小通常为 一个字节)。 就象数组中的每个元素都有一个下标 一样, 每个内存单元都有一个编号, 又 称地址。
前一页
休息
3
什么是地址?
在运行一个程序时, 程序本身及其所 用到的数据都要放在内存储器中:程 序、函数、变量、常数、数组和对象 等, 在内存储器中占有一席之地。 存放在内存储器中的程序和数据都有 一个地址, 用它们占用的那片存储单 元中的第一个存储单元的地址表示。
前一页 休息 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; }
指针变量的赋值运算
指针变量=地址 不能把常量或表达式的地址赋给指针变量。 如:P=&67;P=&(i+5)是非法的 不能将一个整数赋给指针变量,但可以赋整 数值0,表示该指针空指针,不指向任何内容。 指针的类型是它所指向变量的类型。
允许声明指向 void 类型的指针。该指针可 以被赋予任何类型对象的地址。 例: void *general;
休息 36
前一页
动态存储分配
静态存储分配: 程序中使用的变量和数组的类型、数目、大小 是由编写程序时确定的,程序运行时这些数据占 用的存储空间数也是一定的。 缺点:程序无法在运行时根据具体情况(如用户 输入)灵活调整存储分配情况。 动态存储分配: 使用指针、运算符new和delete,在程序运行 期间按照实际需要申请适量内存,克服了静态存 储分配的缺点。
前一页 休息 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; }
前一页 休息 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;
休息 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; }
前一页 休息 14
指针变量的赋值运算
指针变量=地址 p = &a;
p=array;//将数组的首地址赋值给p p= &array[i]; //将数组的第i个元 素的地址赋值给p p = max;//将函数max的入口地址赋 给p p1=p2;//将指针p2的值赋个指针p1
前一页 休息 15
前一页 休息 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;
① 定义语句中的“*”表示该变量为指针变量 ② 一个指针变量只能存储同一种类型变量的地址
前一页
休息
10
指针变量的初始化
语法形式
类型标识符 * 指针名=初始地址;
例: int * pa=&a;
前一页
休息
11
指针变量的初始化
注意事项
用变量地址作为初值时,该变量必须在指 针初始化之前定义。 如:int a; int * pa=&a; 已赋初值的指针可以初始化另一 个指针变 量。 int * pa=&a; int * pb; pb=pa;
21
指针变量的关系运算
关系运算
两个指针变量指向同一个数组中的元 素时,其关系运算的结果表明了这两个 指针变量所指向的数组元素的先后关系 指针可以和零之间进行等于或不等于 的关系运算。例如:p==0或p!=0
前一页
休息
22
指针的关系运算
例如: char a[10] ; char *p1,*p2; p1=a+2; p2=a+4;
前一页 休息 37
动态申请内存操作符 new
<指针>= new <类型> <指针>= new <类型> (<初值>) 功能:在程序执行期间,申请用于存放 类型对象的内存空间,并依初值列表 赋以初值。 结果值: 成功:类型的指针,指向新分配的内存 首地址。 失败:0(NULL)
前一页
休息
4
什么是地址?
在C++中,为某个变量或者函数分配 内存储器的工作由编译程序完成。 内存地址的访问方式 – 直接访问方式:通过变量名访问 – 间接访问方式:通过地址访问
前一页
休息
5
如何知道某个变量、数组、函数的地址
C++规定: 变量的地址可以使用地址运算符&求 得。例如, &x表示变量x的地址; 数组的地址, 即数组第一个元素的地 址, 可以直接用数组名表示; 函数的地址用函数名表示。
前一页 休息 6
什么是指针
指针是C++语言中的一种数据类型, 是专门用来处理地址的。 指针是某个内存单元的首地址。
前一页
休息
7
什么是指针变量?
指针变量是包含另一个变量地址的变 量。
指针变量也是一个变量,遵循先定义, 后使用。 定义指针变量的类型是由该指针指向 的变量类型决定。
前一页 休息 8
前一页 休息 17
程序运行的结果是: Output int i=10 Output int pointer i=10
前一页
休息
18
指针变量的算术运算
指针与整数的加减运算 –指针 p 加上或减去 n ,其意义是 指针当前指向位置的前方或后方第 n 个数据的地址。 –这种运算的结果值取决于指针指向 的数据类型。 指针加一,减一运算 –指向下一个或前一个数据。
–&a:取变量a的地址。 –*a:指针变量所指向的变量的值。
–int
前一页 休息
y=5; int* p; p=&y;cout<<*p;
13
指针与地址运算符
*出现在声明语句和执行语句中 的含义是不同的。 int* p; // *在声明语句中表 示声明的是指针,声明p是整型指 针 cout<<*p; // *在执行语句中表 示指针所指对象集合a、b的元素个 数和各个元素的值,计算并输出其交集