vc++第7章 指针和引用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
变量 i ch f1
4字节
q p
2004 2005
‘A’
1字节
4字节
3.14
2000 4字节
4字节
2008
指针变量可执行的运算
赋值运算 访问(引用、输出) 算术运算 关系运算
指针变量可执行的运算之赋值运算 之
同类型变量起始地址赋给 p 指针变量 p1
int *p=&i; char *q=&ch; float *t; t=&f1; 10
指针和字符串
通常把字符串作为一个整体来使用, 通常把字符串作为一个整体来使用 , 用指 针处理字符串更加紧凑和方便, 针处理字符串更加紧凑和方便 , 当用指针 指向字符串时, 并不关心存放字符串的数 指向字符串时 , 组的大小, 组的大小 , 只关心是否处理到字符串的结 束标记。 束标记。
指针变量存放的地址对应变量空间的 值。(指针所指变量的值)
p 指针变量存放的值,为地址 p1
10
i
cout<<“p=”<<p<<‘\n’; cout<<“*p=”<<*p<<‘\n’; *p1+=2; cout<<“*p=”<<*p<<‘\n’;
‘A’
ch f1
3.14
指针变量可执行的运算之算术运算 之
指针和引用
指针的概念
int x[3]={0,1,2};
x
x[1] x[3]
0 1 2 。。。(未知内容空间) 。。。(未知内容空间) 未知内容空间
的引用, 对数组元素x[i]的引用,即为对 对应地址+ (x对应地址+sizeof(int)×i) 空间的值的引用 对应地址 ( ) ) 系统通过存储空间地址访问空间所存储数据。 系统通过存储空间地址访问空间所存储数据。 指针
指针和一维数组(例) 例
设有说明int i,*p=&i;要实现i的内容加10 10, (3) 设有说明 int i,*p=&i; 要实现 i 的内容加 10 , 下 面的语句( 是错的。 面的语句()是错的。 p=p+10 10; A. p=p+10; *p+10 C. *p= *p+10 i=*p+10 10; B. i=*p+10; *p=i+10 D. *p=i+10
q t p2
i
同类型指针变量可相互赋 值
int *p1; p1=p;
‘A’
ch f1
给任一指针变量赋值为0
(表示不指向任何空间,常用于初 表示不指向任何空间, 表示不指向任何空间 始化指针变量) 始化指针变量
3.14
int *p2; p2=0;
指针变量可执行的运算之访问 之
指针(变量)名: *指针名:
a a[0] a[1] a[2]
a[0][0] a[1][2] a[2][3]
a[0][0],a[0][1],a[0][2],a[0][3]
指针和二维数组二维数组的相关地址
a a+0 a+i 数组起始地址,0行起始地址 第0行行地址 第i行行地址
&
* a[0]
a[i]
第0行0列元素地址 第i行0列元素地址
指针和一维数组用指针实现排序
for(i=0;i<n-1;i++) int *p=a; for(j=i+1;j<n;j++) for(i=0;i<n-1;i++) if(a[j]<a[i]) for(j=i+1;j<n;j++) { t=a[i]; if(*(p+j)<*(p+i)) a[i]=a[j]; { t=*(p+i); a[j]=t; *(p+i)=*(p+j) } *(p+j)=t; }
课堂练习用指针查找一维数组中的最大值
int *p_max=________; for(i=1;i<n-1;i++) { if(_____<a[i]) p_max=_______; } cout<<“max one is:”<<______;
指针和二维数组
二维数组的各个元素是按行连续存放的
二维数组可以看成特殊的一维数组, 二维数组可以看成特殊的一维数组,这个特殊的一维 数组的元素又是一个一维数组。 数组的元素又是一个一维数组。
number
name
通过指针访问结构体类型的成员使用指向 运算符, >number。 运算符,如s->number。
指针和数组
数组的指针是指数组的起始地址 , 数组的指针 是指数组的起始地址, 数组元 是指数组的起始地址 素的指针是数组元素的地址 是数组元素的地址。 素的指针是数组元素的地址。 引用数组元素可以用下标法( a[3 引用数组元素可以用下标法(如a[3]), 也可以用指针法, 也可以用指针法,即通过指向数组元素的指针 找到所需的元素,使用指针占用内存少, 找到所需的元素,使用指针占用内存少,运行 速度快,目标程序质量高。 速度快,目标程序质量高。
10
i
p=p+2;
p+2*sizeof(int)
20
j
30
k
指针变量可执行的运算之算术运算 之
p
指针只进行加减运算
自增或自减运算 指针加或减一个整数 P-1 p ± n的意义是p ± n∗sizeof(T)
10
i
p=p+2;
p+2*sizeof(int)
20
j
cout<<*(p-1);
30
k
指针变量可执行的运算之关系运算 之
a+i+j 第i+j行行地址
a[i]+j 第i行j列元素地址
“*”出现在行地址前,将地址“降”为元素地址 * 出现在行地址前 将地址“ 出现在行地址前, 出现在元素地址前, “&”出现在元素地址前,将地址“升”为行地址 出现在元素地址前 将地址“ a+0和&a[0]等价、*(a+i)和a[i]等价 等价、 和 等价 ) 等价 定义的普通指针只能指向元素空间、即只能用元素地址赋值! 定义的普通指针只能指向元素空间、即只能用元素地址赋值!
要求同类型的指针变量进行比较, 要求同类型的指针变量进行比较, 同类型的指针变量进行比较
两个指针相同, 两个指针相同,两指针指向相同的内存单元 两个指针不同,两指针指向不同的内存单元 两个指针不同,
与0比较:表示指针变量的值是否为空。 比较:表示指针变量的值是否为空。
优先级
指针运算符“ 取地址运算符“ , 指针运算符“*”,取地址运算符“&”,自增运 算符“++”,自减运算符“--”,优先级相同, 算符“++ ,自减运算符“-- ,优先级相同,左结 合。 设有: 设有: a[10]={10 20,30,40,50} 10]={10, int a[10]={10,20,30,40,50},*p1,b; 则: =&a[0],b=*p1++; p1=&a[0],b=*p1++; p1=&a[0],b=*++p1; =&a[0],b=*++p1 =&a[0],b=(*p1)++; p1=&a[0],b=(*p1)++; =&a[1],b=++*p1 p1=&a[1],b=++*p1;
练习
输入两个整数分别给a 输入两个整数分别给a和b,按先大后小的顺序输出a和b. 按先大后小的顺序输出a
void main() *p1,*p2,a,b; { int *p1,*p2,a,b; cin>>a>>b; cin>>a>>b; =&a; =&b; p1=&a; p2=&b; if(a<b) p=p1 =p2 =p; { p=p1; p1=p2;p2=p;} cout<<a<<b; cout<<a<<b; cout<<*p1<<*p2 cout<<*p1<<*p2; }
指针和一维数组(例) 例
(1)执行下列语句后,*(p+2)的值为() 执行下列语句后, (p+2 的值为( ab”,*p char s[]= “ab ,*p; ab ,*p; p=s; p=s; (2)具有相同类型的指针变量p和数组a,不能进行 具有相同类型的指针变量p和数组a,不能进行 a, 的操作是( 的操作是() A.p=a p=&a[0 C. p=&a[0] p=a[0 B. p=a[0] p=&a[1 D. p=&a[1]
p+=4 B. p+=4, *(p++) p+=4 D. p+=4, ++*p
指针和二维数组利用指针将二维数组排序
int *p=&a[0][0]; //p=a[0]; for(i=0;i<15;i++) for(j=i+1;j<16;j++) if(*(p+i)>*(p+j)) { temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; }
课堂练习
? *(*(a+i)+j)代表什么意思 代表什么意思 ? *&a[i]+j 代表什么意思 执行以下程序段后, 的值为() 执行以下程序段后,m的值为()
m,*p,a[2][3]={{1 },{4 }}; int m,*p,a[2][3]={{1,2,3},{4,5,6}}; p=&a[0][0 p=&a[0][0]; m=(*p)*(*(p+2))*(*(p+4)); m=(*p)*(*(p+2))*(*(p+4));
3.14
f1 4字节
2000
指针变量的定义
格式: 格式:
指针变量名> <指针变量所指向的数据类型> *<指针变量名> 指针变量所指向的数据类型> 例:int *p; 是指向整型数据的指针变量, 只能存放整型数据的地址, (1) p是指向整型数据的指针变量,p只能存放整型数据的地址, 大小为4个字节(地址总是4个字节的) 大小为4个字节(地址总是4个字节的); (2) 一个指针变量只能指向一种类型的变量; 一个指针变量只能指向一种类型的变量; 只能指向一种类型的变量 未指定指针变量的值时,其值不定(静态、文件类型除外) (3) 未指定指针变量的值时,其值不定(静态、文件类型除外) 定义时可初始化, (4) 定义时可初始化,如 *p=&i; *)0 2000H int *p=&i; 或 int *p=(int *)0x2000H;
指针和一维数组
int a[10], *p,*q; p=&a[0]; a q=a;
p q
。。。
a、p、q都是数组a的起始地址,但是a没有空 都是数组a的起始地址,但是a 可视为常量,不能做自增、自减操作! 间,可视为常量,不能做自增、自减操作!
指针和一维数组
p+i和a+i就是a[i]的地址 实际地址为: 就是a[i]的地址, (1) p+i 和 a+i 就是 a[i] 的地址 , 实际地址为 : a+i*sizeof(int) a+i*sizeof(int); *(p+i)或 (a+i)就是p+i或 a+i所指向的数 就是p+i (2) *(p+i) 或 * (a+i) 就是 p+i 或 a+i 所指向的数 组元素, a[i]或p[i]; 组元素,即a[i]或p[i]; 可以对指针变量进行运算, (3) 可以对指针变量进行运算 , 但 不允许对数 组名进行运算。用指针访问数组元素时, 组名进行运算。用指针访问数组元素时,编译程 序不作下标是否越界的检查。 序不作下标是否越界的检查。
若有“ a[][4]={1,2,3,4,5,6,7,8,9,10},*p=*(a+1);” 若有“int a[][4]={1,2,3,4,5,6,7,8,9,10},*p=*(a+1); 则值为9的表达式是() 则值为9的表达式是()
A.p+=3,*p++ p+=3 p+=4 C. p+=4,*++p
&:用来取变量的地址 :
指针变量的定义
int *p=&i; p
地址 2000
10
变量 i ch f1
4字节 1字节
2004 2005
‘A’
3.14
2000
4字节
p
4字节
2008
指针变量的定义
int *p=&i; char *q=&ch; float *t=&f1;
2004
p q t
地址 2000
p
指针只进行加减运算
自增或自减运算 指针加或减一个整数 p ± n的意义是p ± n∗sizeof(T)
p:指针名 : n:加减的整数 : T:指针类型 :
10
i
20
j
30
k
指针变量可执行的运算之算术运算 之
p
指针只进行加减运算
自增或自减运算 指针加或减一个整数 p ± n的意义是p ± n∗sizeof(T)
用户无权限访问, 用户无权限访问, 系统报错! 系统报错!
指针和指针变量
变量的指针: 变量的指针:
变量的地址
地址 2000
10 ‘A’
变量 i ch 4字节 1字节
指针变量: 指针变量:
2004 定 义 一 个 变 量 , 用 来 2源自文库05
存放一个内存单元的 地址,称为一个指针 变量(简称为指针)。 2008
a
3
b
5
p1
&a
p2
&b
a
3
b
5
p1
&b
p2
&a
结构体类型的指针变量
struct student number; { int number; name[10 10] char name[10]; }; stu1 student stu1; *s=&stu1 student *s=&stu1;
s stu1
变量 i ch f1
4字节
q p
2004 2005
‘A’
1字节
4字节
3.14
2000 4字节
4字节
2008
指针变量可执行的运算
赋值运算 访问(引用、输出) 算术运算 关系运算
指针变量可执行的运算之赋值运算 之
同类型变量起始地址赋给 p 指针变量 p1
int *p=&i; char *q=&ch; float *t; t=&f1; 10
指针和字符串
通常把字符串作为一个整体来使用, 通常把字符串作为一个整体来使用 , 用指 针处理字符串更加紧凑和方便, 针处理字符串更加紧凑和方便 , 当用指针 指向字符串时, 并不关心存放字符串的数 指向字符串时 , 组的大小, 组的大小 , 只关心是否处理到字符串的结 束标记。 束标记。
指针变量存放的地址对应变量空间的 值。(指针所指变量的值)
p 指针变量存放的值,为地址 p1
10
i
cout<<“p=”<<p<<‘\n’; cout<<“*p=”<<*p<<‘\n’; *p1+=2; cout<<“*p=”<<*p<<‘\n’;
‘A’
ch f1
3.14
指针变量可执行的运算之算术运算 之
指针和引用
指针的概念
int x[3]={0,1,2};
x
x[1] x[3]
0 1 2 。。。(未知内容空间) 。。。(未知内容空间) 未知内容空间
的引用, 对数组元素x[i]的引用,即为对 对应地址+ (x对应地址+sizeof(int)×i) 空间的值的引用 对应地址 ( ) ) 系统通过存储空间地址访问空间所存储数据。 系统通过存储空间地址访问空间所存储数据。 指针
指针和一维数组(例) 例
设有说明int i,*p=&i;要实现i的内容加10 10, (3) 设有说明 int i,*p=&i; 要实现 i 的内容加 10 , 下 面的语句( 是错的。 面的语句()是错的。 p=p+10 10; A. p=p+10; *p+10 C. *p= *p+10 i=*p+10 10; B. i=*p+10; *p=i+10 D. *p=i+10
q t p2
i
同类型指针变量可相互赋 值
int *p1; p1=p;
‘A’
ch f1
给任一指针变量赋值为0
(表示不指向任何空间,常用于初 表示不指向任何空间, 表示不指向任何空间 始化指针变量) 始化指针变量
3.14
int *p2; p2=0;
指针变量可执行的运算之访问 之
指针(变量)名: *指针名:
a a[0] a[1] a[2]
a[0][0] a[1][2] a[2][3]
a[0][0],a[0][1],a[0][2],a[0][3]
指针和二维数组二维数组的相关地址
a a+0 a+i 数组起始地址,0行起始地址 第0行行地址 第i行行地址
&
* a[0]
a[i]
第0行0列元素地址 第i行0列元素地址
指针和一维数组用指针实现排序
for(i=0;i<n-1;i++) int *p=a; for(j=i+1;j<n;j++) for(i=0;i<n-1;i++) if(a[j]<a[i]) for(j=i+1;j<n;j++) { t=a[i]; if(*(p+j)<*(p+i)) a[i]=a[j]; { t=*(p+i); a[j]=t; *(p+i)=*(p+j) } *(p+j)=t; }
课堂练习用指针查找一维数组中的最大值
int *p_max=________; for(i=1;i<n-1;i++) { if(_____<a[i]) p_max=_______; } cout<<“max one is:”<<______;
指针和二维数组
二维数组的各个元素是按行连续存放的
二维数组可以看成特殊的一维数组, 二维数组可以看成特殊的一维数组,这个特殊的一维 数组的元素又是一个一维数组。 数组的元素又是一个一维数组。
number
name
通过指针访问结构体类型的成员使用指向 运算符, >number。 运算符,如s->number。
指针和数组
数组的指针是指数组的起始地址 , 数组的指针 是指数组的起始地址, 数组元 是指数组的起始地址 素的指针是数组元素的地址 是数组元素的地址。 素的指针是数组元素的地址。 引用数组元素可以用下标法( a[3 引用数组元素可以用下标法(如a[3]), 也可以用指针法, 也可以用指针法,即通过指向数组元素的指针 找到所需的元素,使用指针占用内存少, 找到所需的元素,使用指针占用内存少,运行 速度快,目标程序质量高。 速度快,目标程序质量高。
10
i
p=p+2;
p+2*sizeof(int)
20
j
30
k
指针变量可执行的运算之算术运算 之
p
指针只进行加减运算
自增或自减运算 指针加或减一个整数 P-1 p ± n的意义是p ± n∗sizeof(T)
10
i
p=p+2;
p+2*sizeof(int)
20
j
cout<<*(p-1);
30
k
指针变量可执行的运算之关系运算 之
a+i+j 第i+j行行地址
a[i]+j 第i行j列元素地址
“*”出现在行地址前,将地址“降”为元素地址 * 出现在行地址前 将地址“ 出现在行地址前, 出现在元素地址前, “&”出现在元素地址前,将地址“升”为行地址 出现在元素地址前 将地址“ a+0和&a[0]等价、*(a+i)和a[i]等价 等价、 和 等价 ) 等价 定义的普通指针只能指向元素空间、即只能用元素地址赋值! 定义的普通指针只能指向元素空间、即只能用元素地址赋值!
要求同类型的指针变量进行比较, 要求同类型的指针变量进行比较, 同类型的指针变量进行比较
两个指针相同, 两个指针相同,两指针指向相同的内存单元 两个指针不同,两指针指向不同的内存单元 两个指针不同,
与0比较:表示指针变量的值是否为空。 比较:表示指针变量的值是否为空。
优先级
指针运算符“ 取地址运算符“ , 指针运算符“*”,取地址运算符“&”,自增运 算符“++”,自减运算符“--”,优先级相同, 算符“++ ,自减运算符“-- ,优先级相同,左结 合。 设有: 设有: a[10]={10 20,30,40,50} 10]={10, int a[10]={10,20,30,40,50},*p1,b; 则: =&a[0],b=*p1++; p1=&a[0],b=*p1++; p1=&a[0],b=*++p1; =&a[0],b=*++p1 =&a[0],b=(*p1)++; p1=&a[0],b=(*p1)++; =&a[1],b=++*p1 p1=&a[1],b=++*p1;
练习
输入两个整数分别给a 输入两个整数分别给a和b,按先大后小的顺序输出a和b. 按先大后小的顺序输出a
void main() *p1,*p2,a,b; { int *p1,*p2,a,b; cin>>a>>b; cin>>a>>b; =&a; =&b; p1=&a; p2=&b; if(a<b) p=p1 =p2 =p; { p=p1; p1=p2;p2=p;} cout<<a<<b; cout<<a<<b; cout<<*p1<<*p2 cout<<*p1<<*p2; }
指针和一维数组(例) 例
(1)执行下列语句后,*(p+2)的值为() 执行下列语句后, (p+2 的值为( ab”,*p char s[]= “ab ,*p; ab ,*p; p=s; p=s; (2)具有相同类型的指针变量p和数组a,不能进行 具有相同类型的指针变量p和数组a,不能进行 a, 的操作是( 的操作是() A.p=a p=&a[0 C. p=&a[0] p=a[0 B. p=a[0] p=&a[1 D. p=&a[1]
p+=4 B. p+=4, *(p++) p+=4 D. p+=4, ++*p
指针和二维数组利用指针将二维数组排序
int *p=&a[0][0]; //p=a[0]; for(i=0;i<15;i++) for(j=i+1;j<16;j++) if(*(p+i)>*(p+j)) { temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; }
课堂练习
? *(*(a+i)+j)代表什么意思 代表什么意思 ? *&a[i]+j 代表什么意思 执行以下程序段后, 的值为() 执行以下程序段后,m的值为()
m,*p,a[2][3]={{1 },{4 }}; int m,*p,a[2][3]={{1,2,3},{4,5,6}}; p=&a[0][0 p=&a[0][0]; m=(*p)*(*(p+2))*(*(p+4)); m=(*p)*(*(p+2))*(*(p+4));
3.14
f1 4字节
2000
指针变量的定义
格式: 格式:
指针变量名> <指针变量所指向的数据类型> *<指针变量名> 指针变量所指向的数据类型> 例:int *p; 是指向整型数据的指针变量, 只能存放整型数据的地址, (1) p是指向整型数据的指针变量,p只能存放整型数据的地址, 大小为4个字节(地址总是4个字节的) 大小为4个字节(地址总是4个字节的); (2) 一个指针变量只能指向一种类型的变量; 一个指针变量只能指向一种类型的变量; 只能指向一种类型的变量 未指定指针变量的值时,其值不定(静态、文件类型除外) (3) 未指定指针变量的值时,其值不定(静态、文件类型除外) 定义时可初始化, (4) 定义时可初始化,如 *p=&i; *)0 2000H int *p=&i; 或 int *p=(int *)0x2000H;
指针和一维数组
int a[10], *p,*q; p=&a[0]; a q=a;
p q
。。。
a、p、q都是数组a的起始地址,但是a没有空 都是数组a的起始地址,但是a 可视为常量,不能做自增、自减操作! 间,可视为常量,不能做自增、自减操作!
指针和一维数组
p+i和a+i就是a[i]的地址 实际地址为: 就是a[i]的地址, (1) p+i 和 a+i 就是 a[i] 的地址 , 实际地址为 : a+i*sizeof(int) a+i*sizeof(int); *(p+i)或 (a+i)就是p+i或 a+i所指向的数 就是p+i (2) *(p+i) 或 * (a+i) 就是 p+i 或 a+i 所指向的数 组元素, a[i]或p[i]; 组元素,即a[i]或p[i]; 可以对指针变量进行运算, (3) 可以对指针变量进行运算 , 但 不允许对数 组名进行运算。用指针访问数组元素时, 组名进行运算。用指针访问数组元素时,编译程 序不作下标是否越界的检查。 序不作下标是否越界的检查。
若有“ a[][4]={1,2,3,4,5,6,7,8,9,10},*p=*(a+1);” 若有“int a[][4]={1,2,3,4,5,6,7,8,9,10},*p=*(a+1); 则值为9的表达式是() 则值为9的表达式是()
A.p+=3,*p++ p+=3 p+=4 C. p+=4,*++p
&:用来取变量的地址 :
指针变量的定义
int *p=&i; p
地址 2000
10
变量 i ch f1
4字节 1字节
2004 2005
‘A’
3.14
2000
4字节
p
4字节
2008
指针变量的定义
int *p=&i; char *q=&ch; float *t=&f1;
2004
p q t
地址 2000
p
指针只进行加减运算
自增或自减运算 指针加或减一个整数 p ± n的意义是p ± n∗sizeof(T)
p:指针名 : n:加减的整数 : T:指针类型 :
10
i
20
j
30
k
指针变量可执行的运算之算术运算 之
p
指针只进行加减运算
自增或自减运算 指针加或减一个整数 p ± n的意义是p ± n∗sizeof(T)
用户无权限访问, 用户无权限访问, 系统报错! 系统报错!
指针和指针变量
变量的指针: 变量的指针:
变量的地址
地址 2000
10 ‘A’
变量 i ch 4字节 1字节
指针变量: 指针变量:
2004 定 义 一 个 变 量 , 用 来 2源自文库05
存放一个内存单元的 地址,称为一个指针 变量(简称为指针)。 2008
a
3
b
5
p1
&a
p2
&b
a
3
b
5
p1
&b
p2
&a
结构体类型的指针变量
struct student number; { int number; name[10 10] char name[10]; }; stu1 student stu1; *s=&stu1 student *s=&stu1;
s stu1