内容正文:
YCF
正版可修改PPT
(中职)C语言程序设计模块八ppt电子课件
1
指针
模块8
LOGO
8.1指针的基本概念
在计算机中,所有数据都是存放在存储器中的。各数据类型占用不等的内存单元,如int型占2 B、long型占4 B等。在16位环境中,规定指针占2 B的内存单元,以此为基准,32位环境中为4 B,64位环境中为8 B。
指针理解如图8-1所示。
图8-1指针理解
8.1指针的基本概念
(1)内存单元:一般把1个字节(1 B)作为一个内存单元(8 bit)。数据以二进制码形式存储于内存单元中。
(2)指针及指针值:给每个内存单元编号(如1000),就可以快速准确地找到该内存单元。这个编号也称地址,这种地址就是指针。因此,指针值就是地址。
(3)指针变量:把指针保存于某个变量中,这个变量称为指针变量。
上图中,数组a有6个元素值,p为指针变量,保存有6个地址,这6个地址分别对应6个元素值的内存单元。通过这6个地址,就能快速地找到数组a的6个值。因而,p是指向数组a的指针。
一个指针是一个地址,是常量;而一个指针变量却可以被赋予不同的指针值,是变量。因此,严格地说,指针和指针变量并不是同一个概念。而在日常中,为了称呼方便,我们常把指针变量称为指针。读者对此应有清晰的认识。
8.2指针变量的定义和初始化
一般指针变量值初始化为单变量地址:
int *p,a;
p=&a; /*定义一个整型指针p,该指针指向整型变量a的地址*/
写为一行就是:
int a,*p=&a;
指针变量值初始化为单变量地址时,不要忘了“&”运算符。
再如:
float m,*pf=&m;
8.2.1一般指针变量的定义与初始化
8.2指针变量的定义和初始化
8.2.2一维数组指针变量的定义与初始化
一维数组指针变量值初始化时,只需指向数组名即可,因为数组名即为该数组首元素首地址。
int a[10],*p;
p=a; /*定义一个一维数组指针p,该指针指向一维数组a*/
因为数组名代表首元素首地址,因此p=a等价于p=&a[0]。
写为一行就是:
int a[10],*p=a;
再如:
float b[5],*pf=b;
由此可见:数组名、指针及第1个元素首地址均指向同一个内存单元。
8.2指针变量的定义和初始化
8.2.3二维数组指针变量的定义与初始化
定义规则:
类型(*指针变量名)[长度]
长度指的是二维数组的列数。
int a[2][3],(*p)[3];
p=a;/*定义二维数组指针p,该指针指向二维数组a*/
写为一行就是:
int a[2][3],(*p)[3]=a;
要特别注意的是:不能忘记(),否则就变成了指针数组(后述)。
区分:
int a[2][3],*p[3];/*这里p是指针数组名而不是数组指针*/
8.2指针变量的定义和初始化
8.2.4字符串指针变量的定义与初始化
依上得知:字符串指针就是字符数组的首地址。
char *p,c[8];
p=c;/*定义字符串指针p,该指针指向字符数组c的首地址*/
写成一行就是:
char c[8],*p=c;
在定义字符串指针变量时,可以给该指针变量初始化字符串,但要明白的是:该指针变量不是“存放”字符串,而是指向字符串的首地址。
char *q,*p="How are you";
q="Nice to meet you";
这里定义了两个字符串指针,p指向字符串"How are you"的首地址(元素H的地址),q指向字符串"Nice to meet you"的首地址(元素N的地址)。
8.2指针变量的定义和初始化
8.2.4字符串指针变量的定义与初始化
最后需要指出的是:
(1)指针变量在使用前必须初始化,否则会影响程序的运行,甚至崩溃。
(2)指针变量的初始化只有三种情况:
①赋地址。
②赋空值。例如,“int a,*p=NULL;”,赋空值表示不指向任何内存单元。
③赋0,如“int a,*p=0;”。
(3)任何指针只能指向其同类,即指针变量的类型必须和其指向的变量类型一致。
8.2指针变量的定义和初始化
函数指针,顾名思义,就是指向函数的指针。
1.函数指针的定义
类型 (*函数指针变量名)();
注意两个()都不能少。例如,“int (*p)();”定义一个函数指针p,该指针指向一个返回值为int型的函数;“float (*p1)(float);”定义一个函数指针p1,该指针指向一个具有float形参,返回值为float型的函数。
2.函数指针的初始化
假设有float型函数fm()和fn()。函数名是函数的入口地址,同数组名一样,是常量。函数指针的初始化就是指向函数名。同样,函数指针与其指向的函数必须是同一类型的。例如:
float (*p1)(float),(*