第五讲 指针

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针的引用与运算

指针可以先不明确定义类型,只定义一个无类型的指针, 以后根据需要再用强制类型转换的方法明确它的类型。

例5.3 无类型指针使用样例。
必须明确p指 向的空间存放 的数据类型
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与数组
&a=3204003;
3204001 3204002 3204003 3204004 3204005 3204006 3204007
3
a
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针概念、定义与内存分配

指针变量定义 int *p=NULL; p是一个指针变量,指向一个 内存空间,里面存放在是一 个内存地址,赋值为NULL(其
输入格式:第1行,3个整数N、M、K,范围都是[1..100000];下
面有K行,每行3个整数:a b c,表示第a行第b列有数据c。数据在 int范围内,保证是行优先的次序。
输出格式:1行,K个整数,是按照列优先次序输出的数。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与数组


输入样例: 4 5 9 1 2 12 1 4 23 2 2 56 2 5 78 3 2 100 3 4 56 4 1 73 4 3 34 4 5 55 输出样例: 73 12 56 100 34 23 56 78 55
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针的引用与运算

指针变量的+、-运算 int a=3; int *p=&a; p++; cout<<*p<<endl; *p++; cout<<*p<<endl;
3204001 3204002 3204003 3204004 3204005 3204006 3204007
c 1 1
1
2
3
3
1
4
2
5
2
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与字符串

例5.8 C语言的字符串编程示例。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与字符串

字符串拷贝

字符串长度
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与字符串

字典序比较两字符串大小

指针也可以看成数组名
例5.6 动态数组,计算前缀和数组。b是数组a的前缀和的
数组定义:b[i]=a[0]+a[1]+a[2]+…+a[i],即b[i]是a的 前i+1个元素的和。 申请了连续 的n个int型 的空间
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与数组

例5.7 行列转换。矩阵可以认为是N*M的二维数组。现在有一个巨大

简单方法查找子串
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
3 5 4
3204004 NULL 3204003
a
p
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针的引用与运算

指针变量的运算一般都是配合数组操作的 例5.2 输入n个整数,使用指针变量访问输出。
指向数组的开始 元素地址
不是简单的加1, 而是根据类型int 增加sizeof(int)

数组名在一定意义上可以看成是指针
例5.4 用数组名访问数组。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与数组

例5.5 scanf使用数组名。
a当指针,a+i是 指向数组的第i 个元素的指针
可以改写成 *(a+i)
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针与数组
1 1 2 3 4 73
2 12 56 100
3
4 23
5
78 56 34 55
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
wenku.baidu.com
指针与数组
1
2 3 4
1
2
12
56 100
3
4
23
5
a 1
1
73 12 34 23 78
2
3
78 56 34 55
2 3 4 5
56
100
73
56 55
a[y[i]]是指 针,向后移 为什么?
指针定义: 储存类型 *指针变量名 取地址运算符: & 间接运算符: *
指针变量直接存取的是内存地址
间接存取的才是储存类型的值
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针概念、定义与内存分配

例5.1 输入两个不同的浮点数,通过指针把最大值+10, 并输出。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
但稀疏的矩阵,N、M范围是[1..100000],有K个位置有数据,K的范
围是[1..100000]。 矩阵输入的方式是从上到下(第1行到第N行)、从左到右(第1
列到第M列)扫描,记录有数据的坐标位置(x,y)和值(v)。这是
按照行优先的方式保存数据的,现在要求按列优先的方式输出数据, 即从左到右、从上到下扫描,输出有数据的数值。
第五讲
指 针
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
功能强大的利器——指针

指针是C++中功能强大、被认为“太底层操作”的一个数 据结构;

理解指针的原理和运算是高水平OI选手必须具备的能力。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针概念、定义与内存分配

普通变量定义 int a=3;
指针的引用与运算

指针变量的初始化

int *p=NULL; int a;
(NULL是特殊的地址0,叫零指针)
int *p=&a;

(p初始化为a的地址)
(申请一个空间给p,*p内容不确定)
int *p=new(int);

定义的局部指针变量,其内容(地址)是随机的,直接对 它操作可能会破坏程序或系统内存的值,所以要保证先初 始化或赋值。
3204001 3204002 3204003 3204004 3204005 3204006 3204007
3
a
NULL
p
实就是0,表示特殊的空地址)。
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针概念、定义与内存分配

给指针变量p赋值 int a=3; int *p=NULL; p=&a; p的值是3204003; *p的值是3; *p=4;
3204001 3204002 3204003 3204004 3204005 3204006 3204007
3 4
a
NULL 3204003
p
江苏省青少年信息学奥林匹克冬令营(C语言班)-金中河西
指针概念、定义与内存分配
说 明 int a=3; int *p; p=&a; *p=4; cout<<p; 结果是:3204003 cout<<*p; 结果是:4 样 例
相关文档
最新文档