跳转到第一页第八章 指 针TC IDE
本章重点,1、指针的概念;
2、变量的、函数的指针;
跳转到第一页第八章 指 针TC IDE
第一节 变量的地址和指针
1、地址与取地址运算:
( 1) C程序中每一个变量都要在内存中占有一个可标识的存储区。
( 2)存储区的地址是指该存储区域中第一个字节的地址。
( 3) C语言除允许在程序中用名字引用一个变量之外,还允许在程序中使用该变量的地址。
例,int i,j,k;
scanf(“%d”,&i);
2000
2002
2004
3010
i
j
k
i_p
3
6
9
2000
:
:
,
内存用户数据区
:
:
跳转到第一页
TC IDE 第一节 变量的地址和指针
2、指针与指针变量:
简言之,指针就是地址。
( 1)内存的访问方式
※ 直接访问:直接按变量的地址存取变量值指通过变量名或地址访问程序中一个变量的存储空间。
例,i=3,j=6,k=9; /* 通过变量 i,j,k 来访问存储单元。 */
※ 间接访问:
指通过存放地址的单元找到变量的存储空间。
例,变量 i,不知道其值及地址,而只知道它的地址放在
3010,3011中,因此可通过存放地址的单元找到变量 i
的值。
注意,对于间接访问,在 c语言中,可定义一种变量专门用来存放其它变量的地址。
例,i_pointer; i_pointer=&i;
跳转到第一页
TC IDE
第一节 变量的地址和指针
( 2)指针与指针变量的概念:
※ 一个变量的地址称为该变量的“指针”。
※ 存放地址的变量叫“指针变量”。
指针变量存放地址。
( 3)变量的指针与指向变量的指针变量区别:
※ 变量的指针:即该变量地址。
※ 指向变量的指针变量:存放着变量地址的变量。
跳转到第一页
TC IDE
第二节 指针变量的定义和基类型
1、指针的类型:
是指它所指向的变量的类型。
例,指向整型变量的指针,其类型便为 int。
2、指针变量的定义:
语法格式,类型标识符 *变量名;
例,int *p1;
char *p2;
float *p3;
注意,(1) * 是说明符,意为该变量是指针型变量。
(2) 指针变量是具有确定的指向的数据类型。
(3) 指针变量必须区分基类型。
跳转到第一页
TC IDE 第三节 给指针变量赋值
1、给指针变量赋地址值:
( 1)通过求地址运算 &获得地址值例,int *p1,*p2,i;
p1=&i; /* 一般不直接赋数值。 */
*p1的意义为 p1所指向的变量 i,
*p1与 i代表同一存储空间,i=3; 则 *p1也为 3。
( 2)通过指针变量获得地址值
p2=p1;
2,给指针变量赋“空”值
p1=NULL;
说明:
( 1) NULL是 stdio.h中的预定义符,用到 NULL需 加命令,#include,stdio.h”
( 2) NULL的值为 0,即“空”。
( 3) p1=NULL ; 等价于 p1=?\0?; 或 p1=0;
2000 3
P1 *p1
i
2000
跳转到第一页
TC IDE
第四节 对指针变量的操作
1、通过指针来引用一个存储单元例,int i =3,j,*p; /*此行的,*”与下面的不同 */
p=&i;
j=*p+2;
“p=&i”的作用是使指针变量 p指向变量 i 。
注意,(1)p是地址变量,而 *p 是非地址变量。
(2),*”:为指针运算符(指向运算符、间接运算符)
为单目运算符。
(*p表示 p所指向的变量)
(3),&”:为取地址运算符,为单目运算符。
(&x表示 x变量的地址)
跳转到第一页
TC IDE 第四节 对指针变量的操作例,int i,j,*p; /*此行的,*”与下面的不同 */
p=&i;
*p=3;
j=*p+2;
“p=&i”的作用是使指针变量 p指向变量 i 。
定义后 p=&i后 *p=3后
i
j
p
:
:
:
:
1000
1002
1004
i
j
p
1000
1002
1004
i
j
p
1000
1002
1004
i
j
p1000
3
1000
1000
1002
1004
j=*p+2后
3
5
1000
跳转到第一页
TC IDE
第四节 对指针变量的操作关于运算符 &和 * 的几点说明:
( 1)结合性,自右向左
&*p1 相当于 &(*p1) ==&(a)==&a==p1
*&a 相当于 *(&a)==a
( 2)优先级:高于算术运算符,低于正负号运算符。
2、移动指针 (指针与整数相加、减 ):
※ 表示指针在内存空间的上下移动。
※ 移动是以其类型长度为单位的 。
请看 p99页例子。
3、指针比较:
例,if(p<q)printf(“p points to lower memory than q.\n”);
if(p==?\0?)printf(“p points to Null.\n”);
跳转到第一页第五节 函数之间地址值的传递一,指针作为函数参数:
1、用指针(地址)作函数参数,可以实现“通过被调用的函数改变主调函数中变量的值”的目的。
2、使用指针作为函数参数可以在调用一个函数时得到多个由被调函数改变了的值。
例,p101的 8.3 两个变量交换
TC IDE
跳转到第一页第五节 函数之间地址值的传递二、返回指针值的函数:
1、函数返回值的类型:
一个函数在被调用之后可以带回一个值返回给主调函数,
这个值可以是整型、浮点型、字符型等,当然也可以是指针类型。
2、返回指针值函数声明的语法格式如下:
类型标识符 * 函数名(形参列表);
请看 p102的例 8,5。
TC IDE
跳转到第一页指向指针的指针:
1、定义:指向指针型数据的指针。
2、定义方法:
类型标识符 ** 指针变量名;
例,int **p;
注意:( 1) 上式定义了一个指针变量 p,它指向另一个指针变量(该指针变量又指向一个整型变量)。
( 2) 上式又相当于 int *(*p);
3、双重指针的赋值:
int **p1;
int *p2;
int i=3;
p2=&i;
p1=&p2;
4,多重指针:
从理论上,可以有多重指针。但一般只用到二重。
例,int i,*p5,**p4,***p3,****p2,*****p1;
TC IDE
&p2 &i 3
p1 p2(指针变量 )i(整型变量 )
跳转到第一页一、常用指针类型变量,(以整型为例)
定 义 形 式 按时打发的 含 义 课件后来按时打发豆腐干
int * p; p为 指向整型数据的指针变量。
int *p( ); p为返回值是 指针值的函数,该指针为整型的。
int **p; p为二重 指针,它指向一个指向整型数据的指针变量。
TC IDE
总结跳转到第一页总结二、指针的运算(三种形式):
1、指针与整数相加、减:
※ 表示指针在内存空间的上下移动。
※ 移动是以其类型长度为单位的 。
2、指针赋值(可以改变指针所指向的实体):
※ 赋以一个对应类型变量的地址。
例,float f1,f2,*pf; pf=&f1; pf=&f2;
※ 同类型指针间的赋值。
例,int a,b; int *pa=&a,*pb=&b; pa=pb;
※ 指针的增 1、减 1,使指针上下移动一个所指向数据类型的空间。
注意,区分 y=*++px和 y=++*px的不同。
区分 y=(*px)++和 y=*px++的不同。
TC IDE
跳转到第一页总结二、指针的运算(三种形式):
例,比较 y=*++px和 y=++*px的不同。
int x=2,y;
int *px=&x;
*(px+1)=5;
y=*++px; /* y=++*px */
TC IDE
5y

2
5
px
px+1
②③

②③
4y
3
5
px
px+1
*px+1