内容正文:
第七章 程序的性能优化--指针
1
CONTENTS
目录
01
02
为什么使用指针
什么是指针
03
指针变量的应用
04
指针变量的运算
05
使用指针访问一维数组中的元素
CONTENTS
目录
06
07
字符型指针引用字符串
使用指针访问二维数组中的元素
08
指针数组与指针的指针
09
使用指针作为函数的参数
10
使用指针作为函数的返回值
11
使用指针调用函数
C语言
知识树
My First Template
指针变量的应用
C语言程序设计
5
C语言
本次任务
利用指针变量交换两个数的大小。
C语言程序设计 –指针变量的应用
My First Template
C语言
指针变量的声明
一般形式: 数据类型 *指针名;
指针的目标变量的数据类型
合法标识符
表示定义指针变量
不是‘*’运算符
例:
int *p1,*p2;
float *q ;
char *t;
注意:
1、int *p1, *p2; 与 int *p1, p2;
2、指针变量名是p1,p2 ,不是*p1,*p2
3、指针变量只能指向定义时所规定类型的变量
4、指针变量定义后,变量值不确定,应用前必须先赋值
5、指针值为NULL的指针称为空指针,这意味着,不指向任何地址
C语言程序设计 –指针变量的应用
My First Template
C语言
例 int i;
int *p=&i;
变量必须已说明过
类型应一致
例 int *p=&i;
int i;
例 int i;
int *p=&i;
int *q=p;
用已初始化指针变量作初值
一般形式: 数据类型 *指针名=初始地址值;
指针变量的初始化
3
变量i
2018
p
*p
i
*p
&i
p
i=3;
*p=3
C语言程序设计 –指针变量的应用
My First Template
100
num
2018
p
内存
C语言
int num, *p;
p = #
*p=100;
指针
2018
&
取地址符
指针变量引用
C语言程序设计 –指针变量的应用
My First Template
C语言
例 main( )
{ int i=10;
int *p;
*p=i;
printf(“%d”,*p);
}
危险!
例 main( )
{ int i=10,k;
int *p;
p=&k;
*p=i;
printf(“%d”,*p);
}
…...
…...
2000
2008
2012
整型变量i
10
指针变量p
2004
随机
指针变量引用
指针变量必须初始化才能引用
C语言程序设计 –指针变量的应用
My First Template
C语言
指针变量的命名规则和其他变量的命名规则一样
指针不能与现有变量同名
指针可存放 C 语言中的任何基本数据类型、数组和其他所有高级数据结构的地址
若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址
应为指针指定一个地址后,才能在语句中使用指针
指针的特点
C语言程序设计 –指针变量的应用
My First Template
C语言
指针
#include <stdio.h>
void main()
{
int var = 100;
int *ptr_var;
ptr_var = &var;
printf(" var 的值是: %d", var);
printf("
var 的内存地址是: %x", &var);
printf("
指针 ptr_var 的地址是: %x
", &ptr_var);
printf("
var 的值是: %d", *ptr_var);
printf("
var 的地址是: %x
", ptr_var);
}
内存
var
ptr_var
100
2018
var的值是:100
var 的内存地址是:2018
2018
2035
指针ptr_var的地址是:2035
var的值是:100
var的地址是:2018
例子
C语言程序设计 –指针变量的应用
My First Template
C语言
#include <stdio.h>
void main()
{
int x,y,*px,*py,t;
printf("请输入要交换房间号:");
scanf("%d,%d",&x,&y);
px=&x;
py=&y;
t=*px;
*px=*py;
*py=t;
printf("第一间房=%d
第二间房=%d
",*px,*py);
}
任务实现
C语言程序设计 –指针变量的应用
My First Template
指针变量的运算
C语言程序设计
14
C语言
赋值运算:指针变量的赋值运算有以下几种形式。
指针变量初始化赋值,前面已作介绍。把一个变量的地址赋予指向相同数据类型的指针变量。
例如:
int a,*pa;
pa=&a; /*把整型变量a的地址赋予整型指针变量pa*/
把一个指针变量的值赋予指向相同类型变量的另一个指针变量。
如:
int a,*pa=&a,*pb;
pb=pa; /*把a的地址赋予指针变量pb*/
指针变量的运算
C语言程序设计 一指针变量的运算
My First Template
C语言
由于pa,pb均为指向整型变量的指针变量,因此可以相互赋值。
把数组的首地址赋予指向数组的指针变量。
例如:
int a[5],*pa;
pa=a;
(数组名表示数组的首地址,故可赋予指向数组的指针变量pa)也可写为:
pa=&a[0];
当然也可采取初始化赋值的方法:
int a[5],*pa=a;
指针变量的运算
C语言程序设计 一指针变量的运算
My First Template
C语言
int x,*p,*q;
p=&x;
q = p;
100
x
ED2A
p
q
ED2A
ED2A
int a[5],*pa;
pa=a;
a[0]
a[1]
a[2]
a[3]
a[4]
23
43
11
50
46
pa
ED2A
ED2E
ED31
Ed35
Ed39
ED2A
指针赋值运算
C语言程序设计 一指针变量的运算
My First Template
C语言
加减算术运算
对于指向数组的指针变量,可以加上或减去一个整数n。
设pa是指向数组a的指针变量,则pa+n,pa-n,pa++,++pa,pa--,--pa运算都是合法的。
指针变量加或减一个整数n的意义是把指针指向的当前位置向前或向后移动n个位置。应该注意,数组指针变量向前或向后移动一个位置和地址加1或减1在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。
如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。
指针变量的运算
C语言程序设计 一指针变量的运算
My First Template
C语言
指针算术运算
int *p,a [8];
p = &a [0];
p++;
使用递增/递减运算符(++ 和 --)将指针递增或递减
内存
a [0]
a [1]
a [2]
a [3]
a [4]
a [5]
a [6]
a [7]
11
22
33
44
55
66
77
88
一个类型为 T 的指针的移动,
以 sizeof(T)为移动单位。
C语言程序设计 一指针变量的运算
My First Template
C语言
例如:
int a[5],*pa;
pa=a; /*pa指向数组a,也是指向a[0]*/
pa=pa+2; /*pa指向a[2],即pa的值为&pa[2]*/
指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。
指针变量的运算
C语言程序设计 一指针变量的运算
My First Template
C语言
p = &a[0];
p = p+ 4;
printf(“%d”,*p);
p= &a[5];
p = p - 2 ;
printf(“%d”,*p);
55
44
内存
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
11
22
33
44
55
66
77
88
指针算术运算
将指针加上或者减去某个整数值
C语言程序设计 一指针变量的运算
My First Template
C语言
两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。
两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2010H-2000H)/4=4,表示pf1和 pf2之间相差4个元素。两个指针变量不能进行加法运算。
两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。
例如:
pf1==pf2表示pf1和pf2指向同一数组元素;
pf1>pf2表示pf1处于高地址位置;
pf1<pf2表示pf2处于低地址位置。
指针变量的运算
C语言程序设计 一指针变量的运算
My First Template
C语言
指针变量还可以与0比较。
设p为指针变量,则p==0表明p是空指针,它不指向任何变量;
p!=0表示p不是空指针。
空指针是由对指针变量赋予0值而得到的。
例如:
#define NULL 0
int *p=NULL;
对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用
指针变量的运算
C语言程序设计 一指针变量的运算
My First Template
$$