
《C语言与程序设计》第八讲课件.ppt
22页C语言程序设计基础,2010.9,第1讲 概述 第2讲 c程序框架 第3讲 数据类型与数组初步 第4讲 c程序设计初步(条件判别与关系运算、循环、结构变量) 第5讲 c程序设计初步(循环与数组的关系) 第6讲 教学回顾(变量、语句、函数与程序结构) 第7讲 函数一(概念、形参与实参、函数间的参数传递) 第8讲 函数二(变量值与地址、指针与数组、函数与程序设计) 第9讲 函数三(算法初步、指针与二维数组) 第10讲 链表一(指针与链表) 第11讲 链表二(结构指针与链表设计) 第12讲 文件、算法初步,课程大纲,,二进制与数据类型,,变量三要素:名字、地址、字节数,,输入输出函数,,数组类型与结构变量,逻辑运算,,if-else结构,,for()结构,C语言生长树,,,程序设计 初级阶段,,,while()结构,,switch()结构,,功能构件化,,,程序设计 基础,,数据私密化,,程序大纲化,,,c程序风格--函数、文件结构与指针,,文件结构化,,指针,函数,数据接口是函数的参量传递,函数的任务分配,数据结构与函数调用,文件归类,,基础是否扎实?,,习题六第二题(字符串与字符串结尾符),第八讲函数二(实参传递形式、指针与数组),参数传递中的指针问题 数组变量的形参与实参传递过程 实参是变量的地址 本节要点--指针变量的概念 指针的概念与指针类型 指针的操作 为什么有不同类型的指针? 形参是指针 指针与一维数组,函数与程序设计--算法初步 递归程序设计 分治算法与对半检索 递归求Fibonacci数列 递归求解汉诺塔 二维数组 概念与定义 二维数组的理解 数值型二维数组--矢量 字符型二维数组--字符串数组 指针数组,,制作c的头文件,,int main() char i; ,i,,,,x,s,2000,2002,2004,1000,,l,,,,a,p,4002,4004,4006,,i,4000,int search(char *p,char a) char i,l; .. ,函数search()存储区域,3000,a,a,b,c,0,2004,a,int search(char *,char );,实参传递的是变量x的值,实参传递的是数组s的首地址,形参是数组--实参是地址,i=search(s,x);,可以理解为调用时,实参向形参赋值,char x=a;,char s=abc;,主函数数据区,,char s10;,,内存,,s,,,,,,,,,,,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,p=s;,,a,b,c,0,p,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,操作数组p就是操作数组s,相当于给定了p的首地址,,形参接收一个地址变量,int search(char *s,char); //函数声明,2个形参数:字符型数组,字符 int main(void) int i;char s40,x; couts; coutx; i=search(s,x);//实际参数表 if(i0)cout<
1001 宝藏,1101,1201,1041 宝书,,,,,,指针表,宝藏地点,魔法书地点,1001,1041,3000,3002,,3004,指针变量名,地址,指针是一个存储地址的变量,新增的宝藏,,1201,指针指向新的地址,通过指针,间接的访问变量,存储指针变量的内存单元,指针存储着数据变量的地址; 通过该地址指引我们找到所需的数据,给指针变量赋值,让指针指向新的对象,指针变量的类型,基本的数据类型,,,指针的值是整数变量的地址,指针的值是字符型变量的地址,,,,指针的值是浮点型变量的地址,,,指针的类型与其所存储的数据变量类型一致,指针取得变量的地址,如下是整型和字符型变量的说明,它们存储在内存: int i_a=20;char ch_a=A;,0,20,A,整数型变量占用2个地址单元,字符型变量占用1个地址单元,如下是整型和字符型指针说明,它们也存储在内存: int *i_p;char *ch_p;,*是指针说明符号,2000,如下是指针取得变量的地址: i_p=,,,,,ch_a,,,,,2002,2004,a,c,4004,4010,,ch_b,,cp1,cp2,2002,2004,char *cp1,*cp2;,cp1=,cp2=,*cp1=x;,x,用间接运算符*通过指针给变量赋值,*cp2=y;,y,指针cp1获得变量ch_a的地址,指针cp2获得变量ch_b的地址,通过指针cp1存储的值(变量的地址),找到变量ch_a,将数据赋给cp1所指向的变量ch_a,,,int main(void) int i,*p; p= ,给指针所指向的数据变量赋值,定义一个整数型指针变量,指针p获得数据变量i的地址,指向它,间接运算符“*”可以直接给指针所指向的变量赋值,指针p已经获得i的地址,指针p的地址,指针p所指向的数据变量i的值,数据变量i的值,指针类型就是它指向的变量数据类型,char *p1=ch_a;,int *p2=i_a;,,*(p1+1),*(p1+2),*(p1+3),,*(p2+1),*(p2+2),*(p2+3),p1加1,对应地址增1,指向ch_a字符型数组的下一元素存储位置,p2每次加1,对应地址增2,指向整型数组i_a的下一元素存储位置,若指针类型不吻合,则指针操作时,不能正确的指向变量的地址.,*(p1+0),*(p2+0),0FF000,,,,0FF001,ch_a0,ch_a1,ch_a2,ch_a3,0FF002,0FF003,,a,b,c,0,变量名,变量地址,0FF010,,,,0FF011,i_a0,i_a1,i_a2,i_a3,0FF012,0FF013,,0,1,0,2,变量名,变量地址,,,,0,3,4,,0,0FF014,0FF015,0FF016,0FF017,0FF040,,,,0FF041,p1,0FF042,00,F0,0F,变量名,变量地址,0FF040,,,,0FF041,p2,0FF042,变量名,变量地址,10,F0,0F,指针运算,对于指向数组的指针变量,可以加上或减去一个整数i.设pa是指向数组a的指针变量,则: pa+=i; pa-=i; pa++; ++pa; pa--; --pa; 偏移量i表示把指针从当前指向的元素位置向前或向后跨过i个元素位置. 注意,是跨过i个元素位置,而不是跨过i个地址单元 怎样能知道一种数据类型占用内存多少字节? sizeof运算符,加上一个偏移量i,指针指向当前元素位置之后的第i个元素位置,减去一个偏移量i,指针指向当前元素位置之前的第i个元素位置,指针从当前元素位置后移一个元素位置,指针从当前元素位置前移一个元素位置,void main(void) int n=0,l=0,i; char s40=; l=sizeof(int); i=sizeof(char); printf(n=%d,n has %u bytes:all ints have %u bytes.n,n,sizeof(n),l); printf(s=%s,s has %u bytes:all char have %u bytes.n,s,sizeof(s),i); ,,,,请解释该语句,sizeof作用于变量或者类型,返回值是一个整型数,是操作数以字节为单位的存储长度.,,,,,,,void main() char ch_a=a; char ch_b=b; get( ,,,ch_a,ch_b,2002,2004,1000,,,,x,y,4004,4010,void get(char *x,char *y) ,3000,a,c,2004,2002,void get(char *,char * );,函数调用时,实参是变量的地址,形参是指针,,char ch_a=a,ch_b=c;,,,ch_a,,,,,,2002,2004,x=,a,c,实参是主调函数内部变量的地址,4004,4010,,ch_b,,,x,y,2002,2004,,*x=x; *y=y;,类似scanf(“%c”, scanf()是指向变量的地址,,x,y,接收地址的变量,操作x和y就是操作ch_a和ch_b,,指针与一维数组,数组是一种数据结构。
它描述了数据元素在内存中的物理存储方式 通过数据元素ai和ai+1(i=0,1,2,)内存地址的相邻存储关系,表达了逻辑上的线性有序关系: 一维数组是具有相同数据类型的元素排列,比如一个字符型数组的逻辑描述是: char a7; 它有7个字符元素,假设内存起始地址是1000,则内存中如下所示:,,a,char *p=a;,p,*(p+0),用下标访问数组元素,p+1,p+2,p+3,p+4,p+5,p+6,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),用指针访问数组元素,地址偏移量,用指针指向一个数组,数组说明,同类型数据的集合,用数组名标识 元素:属同一数据类型,用数组名和下标确定 一维数组 一维数组的定义 定义方式: 数据类型 数组名常量表达式;,合法标识符,表示元素个数 下标从0开始, 是数组运算符; 单目运算符; 优先级(1); 左结合。












