07指针与数组(1)
- 格式:ppt
- 大小:1.69 MB
- 文档页数:38


科技信息 0计算机与信息技术0 SCIENCE&TECHNOLOGYINFORMATION 2007年第27期
浅谈C 五 I,N口 中指针变量的定义与应用
王征风孙中桥贾先 (西安思源职业学院 陕西 西安710038)
【摘 要】介绍了指针变量的定义与指针运算,通过例题掌握复杂指针的应用。 【关键词】c语言;指针;指针变量;指针运算
指针是C语言中最具特色的内容,也是学习C语言的一个难点。 正确而灵活地运用它.可以有效地表示复杂的数据类型。掌握指针的 应用,可以使程序简洁、紧凑、高效。笔者在从事c语言教学中发现很 多同学在学习指针时非常困难,而且往往处于一知半解。笔者将从指 针变量的定义及指针的应用来阐述C语言中的指针这一数据类型。 1.指针变量定义及指针运算 1.1指针变量定义 用户在程序中使用任何类型的变量时都必须遵循先定义后使用 的原则.其定义方式如下: 类型标识符 变量名;(如:int p;)亦即在定义指针变量时,既要 说明它是一个指针,同时也要说明该指针指向哪种类型的数据。 由于指针变量的特别性,在引用指针时~定要小心,它的值只能 是个地址.因此它不能和其它类型变量之间相互赋值。如: int i;p=岛;这是合法的,但若p=i;或i=p;则都是不合法的。 当然若一个指针指向某个变量.为了访问这个变量,可以用间接 寻址的方法通过指针进行。例如: int P,i,j; -_1;p=&i; j= p; 这里P为一个指针变量,保存变量i的地址;而变量i是取P所指 单元的内容(即 p),所以经过上述程序段后j的值为1。 值得注意的是,在使用指针变量之前,必须对其进行初始化操作, 即必须给它赋初值,例如,若将上述语句改为: int P,i,j;x=1;y= p; 则由于P没有指向具体的单元.因此输出Y时将得到一个随机 数。 定义指针变量有以下几种: int i, P, ip,fO, fp(),( PO(); int a[5], ap[5],( pa)[5],( fap[])O; 1.2指针运算 (1)算术运算 含义:对于地址的运算,只能进行整型数据的加、减运算。 规则:指针变量p+n表示将指针指向的当前位置向前或向后移动 n个存储单元。指针变量的算术运算结果是改变指针的指向。指针变 量算术运算的过程: P新=p原值+n*sizeof(类型) 注意:p+n不是加(减)n个字节,而是加(减)n个数据单元。 (2)关系运算 作用:用于标识目标变量在内存中的前后位置。 用法:int i ; int pl=&i, p2=&j; pl>p2用于标识变量i,j在内存的排列顺序。 (3)赋值运算 作用:对指针变量的赋值运算,将改变指针变量所指向的地址。 两个指针变量之间可以相互赋值,也就是说若P和q是指向同类 型数据的指针变量,则执行p=q或q=p都是允许的.但若两者保存的 是不同类型数据的指针变量,则是不可以。如: int P,i;float q, p=&i;q=& //若执行p=q或q=p则是错误的。 2.指针的应用 2.1简单指针变量( p)与指向指针的指针( ip) f1)int P 定义了一个指向整型变量的指针变量,P只能指向整型变量。 main 0 {int a[Sl,i, P; p=a; for(._O.i<5'i++) scanf(”%d”,p++): p=a; for(i_O;i<5;i++) //把数组a的首地址赋给P
数据结构-复习题
1 第一部分:数据结构——线性结构(顺序表、链表、栈、队列、数组、串)
考点:
1、时间复杂度
2、数据的逻辑结构与存储结构相关知识——分类、与存储结构之间的关系
3、顺序表的知识——特点
4、链表的知识——编程求单链表中结点的个数、插入、删除。
5、栈与队列知识——特点、循环队列、基本术语、链队列
6、数组与矩阵——求元素的地址、稀疏矩阵
行优先存储:
下标从1开始:
Loc(Ai,j) = Loc(A1,1)+[(i-1)*n+j-1]*b
下标从0开始:
Loc(Ai,j) = Loc(A0,0)+(i*n+j)*b 列优先存储:
下标从1开始:
Loc(Ai,j) = Loc(A1,1)+[(j-1)*m+i-1]*b
下标从0开始:
Loc(Ai,j) = Loc(A0,0)+(j*m+i)*b
1. 设顺序线性表中有n个数据元素,则第i个位置上插入一个数据元素需要移动表中___________个数据元素;删除第i个位置上的数据元素需要移动表中___________个元素。
2.数据的逻辑结构通常有集合、线性结构、_________ 和 _________ 四类结构。
3.若进栈序列为a、b、c ,且进栈和出栈可以穿插进行,则可能出现_________个不同的出栈序列。
第 3 章 特殊线性表——栈、队列和串
2005-07-14
第 3 章 特殊线性表——栈、队列和串
课后习题讲解
1. 填空
⑴ 设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5, 经过push,push,pop,push,pop,push,push后,输出序列是( ),栈顶指针为( )。
【解答】23,1003H
⑵ 栈通常采用的两种存储结构是( );其判定栈空的条件分别是( ),判定栈满的条件分别是( )。
【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间
⑶( )可作为实现递归函数调用的一种数据结构。
【解答】栈
【分析】递归函数的调用和返回正好符合后进先出性。
⑷ 表达式a*(b+c)-d的后缀表达式是( )。
【解答】abc+*d-
【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。
⑸ 栈和队列是两种特殊的线性表,栈的操作特性是( ),队列的操作特性是( ),栈和队列的主要区别在于( )。
【解答】后进先出,先进先出,对插入和删除操作限定的位置不同
⑹ 循环队列的引入是为了克服( )。
【解答】假溢出
⑺ 数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为( )。
【解答】(rear-front+n)% n
【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。
⑻ 用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是( )和( )。
【解答】O(1),O(n) 【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。
指针的类型:
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型
(1)int *ptr; //指针的类型是int *
(2)char *ptr; //指针的类型是char *
(3)int **ptr; //指针的类型是int **
(4)int (*ptr)[3]; //指针的类型是int(*)[3]
指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
(1)int *ptr; //指针所指向的类型是int
(2)char *ptr; //指针所指向的的类型是char
(3)int **ptr; //指针所指向的的类型是int *
(4)int (*ptr)[3]; //指针所指向的的类型是int()[3]
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。
指针的值(又可叫叫指针所指向的内存区域地址)
指针本身占了多大的内存?你用sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?
数组名和指针
数组名神似指针
int main(int argc, char* argv[])
{
char str1[11] = “HelloWorld";
for(int i=0;i<11;++i)
cout<
return 0;
}
运行结果:
HelloWorld
elloWorld
lloWorld
loWorld
oWorld
World
orld
rld
ld
d
Press any key to continue 又如: