
No.7-2《C语言程序设计》教案备注第七讲指针目1.掌握指针的含义、定义方法和初始化;的2.掌握指针的三种运算方法;要3.了解指针与数组、指针与字符串的关系求|4.掌握将命令行参数传递给主函数的方法;3小时学时划分组织形式讲授+自学+独立作业+上机实做重1.指针的含义、定义方法和初始化;点2.指针的运算;难|3.传递命令行参数;点[引题】上一次课,我们重点研究了数组,包括一维数组、多维数组和字符型数组的定义方法、存储形式、初始化和引用方法。通过学习,大家了解了,数组实质上就是把相同数据类型的数据组织在一起,连续存放在计算机内存区域中,内存区域的首地址,就是数组名。我们可以通过定义数组来准备计算机内存空间,通过初始化给数组中的不同元素进行赋值,而通过数组名【下标引用不同的元素进行各种处理。这就好比日常生活中为了解决把所有男同志都集中在同一所楼内办公,每一员工有一间办公室,首先应给不同房间编房间号,这就类似计算机标识变量位置的单元地址;然后把员工安排进不同房间,这就类似于初始化过程。由此,我们可以看出,对于C语言环境,不管是对变量还是对数组元素进行处理,首先必须对其进行定义,定义的过程就是告诉计算机按定义的数据类型和名称分配内存空间,并进行编址。然后必须进行初始化,初始化的过程实质上就是向存储单元内填充具体的数值。这就告诉我们,计算机内存单元的位置是通过计算机编的地址码来标识的。计算机在处理存储单元中的数据时,首先找到其地址,然后取出里面的数据进行处理。这就给了我们这样一个启发,如果在使用C语言编写程序时,我们人为地定义一种用来存储地址的特殊变量,然后通过对该变量进行处理,以实现快速访问计算机内存单元,实现数据的快速处理。这就给我们提出了这样一个问题,那就是,我们如何定义这种特殊变量?如何对其进行处理,以便实现快速访问计算机内存单元?这就是今天我们要重点讨论的问题,即书中第五章指针
《C 语言程序设计》教案 No.7-2 第七讲 指 针 备 注 目 的 要 求 1.掌握指针的含义、定义方法和初始化; 2.掌握指针的三种运算方法; 3.了解指针与数组、指针与字符串的关系; 4.掌握将命令行参数传递给主函数的方法; 学时划分 3 小时 组织形式 讲授+自学+独立作业+上机实做 重 点 难 点 1. 指针的含义、定义方法和初始化; 2. 指针的运算; 3. 传递命令行参数; [引题]上一次课,我们重点研究了数组,包括一维数组、多维数组和 字符型数组的定义方法、存储形式、初始化和引用方法。通过学习, 大家了解了,数组实质上就是把相同数据类型的数据组织在一起,连 续存放在计算机内存区域中,内存区域的首地址,就是数组名。我们 可以通过定义数组来准备计算机内存空间,通过初始化给数组中的不 同元素进行赋值,而通过数组名[下标]引用不同的元素进行各种处 理。这就好比日常生活中为了解决把所有男同志都集中在同一所楼内 办公,每一员工有一间办公室,首先应给不同房间编房间号,这就类 似计算机标识变量位置的单元地址;然后把员工安排进不同房间,这 就类似于初始化过程。由此,我们可以看出,对于 C 语言环境,不管 是对变量还是对数组元素进行处理,首先必须对其进行定义,定义的 过程就是告诉计算机按定义的数据类型和名称分配内存空间,并进行 编址。然后必须进行初始化,初始化的过程实质上就是向存储单元内 填充具体的数值。这就告诉我们,计算机内存单元的位置是通过计算 机编的地址码来标识的。计算机在处理存储单元中的数据时,首先找 到其地址,然后取出里面的数据进行处理。这就给了我们这样一个启 发,如果在使用 C 语言编写程序时,我们人为地定义一种用来存储地 址的特殊变量,然后通过对该变量进行处理,以实现快速访问计算机 内存单元,实现数据的快速处理。这就给我们提出了这样一个问题, 那就是,我们如何定义这种特殊变量?如何对其进行处理,以便实现 快速访问计算机内存单元?这就是今天我们要重点讨论的问题,即书 中第五章指针

第七讲指针No.7-3第五章指针5.1指针的基本概念二、含义用来存储所指对象的地址的特殊变量二、说明1.指针是用来存储所指对象地址的特殊变量;int x,a[10];px=&x;pa=a;2.指针所指对象:变量、数组及其元素、结构体和联合体;3.指针都有相应的数据类型,用来说明所指对象内存放的数据类型;int *px;char *pch,*pname;4.指针通常占4个字节:5.指针目标、目标变量和目标运算符指针目标:指针指向区域中存放的数据:目标变量:指针指向的变量;a[0]a的首地址地址运算符:&alll指针pa目标运算符:*x的地址a[9]变量xpx:指针变量指针px*px:指针目标&px:指针变量地址5.2指针的定义与初始化二、 定义int x,y,(一)一般形式px=&x,数据类型标识符*指针名;y=x,int*px;y=*px,char*pch,*pname;
第七讲 指 针 No.7-3 第五章 指 针 5.1 指针的基本概念 一、含义 用来存储所指对象的地址的特殊变量 二、说明 1.指针是用来存储所指对象地址的特殊变量; int x,a[10]; px=&x; pa=a; 2.指针所指对象:变量、数组及其元素、结构体和联合体; 3.指针都有相应的数据类型,用来说明所指对象内存放的数据类型; int *px; char *pch,*pname; 4.指针通常占 4 个字节; 5.指针目标、目标变量和目标运算符 指针目标:指针指向区域中存放的数据; 目标变量:指针指向的变量; 地址运算符:& 目标运算符:* px :指针变量 *px:指针目标 &px:指针变量地址 5.2 指针的定义与初始化 一、定义 (一)一般形式 数据类型标识符 *指针名; int *px; char *pch,*pname; 变量 x a[0] a[1] . a[9] a 的首地址 指针 pa y=*px; y=x; px=&x; int x,y; X 的地址 指针 px

No.7-4《C语言程序设计》教案(二)注意事项1.指针名的命名规则同用户自定义标识符:.2.同一行中可以定义多个同类型的指针,之间用逗号分开3.指针名前必须加“*”三、初始化(一)一般形式数据类型标识符*指针名=初始地址值:(二)注意事项1..初始化是针对指针变量;2.把变量地址赋给指针变量时,该变量事先必须已定义3.指针目标变量的数据类型必须与指针的数据类型一致:double x;intpx=&x;(/*数据类型不一致*/×)4.可以把一个指针的值赋给另一指针;一intx;int*p=&x;int*q=p;5.不能把一般的整数数据赋给指针,但可以初始化为空指针int*px=0;6.不能用动态型变量地址初始化一个静态或全局变量类型的指针:(三)应用举例指出下列个语句的执行情况#include结果为:main()a=5int x,y,d;char c,*pa=5int*px=&x,int x,a[10];int a=5;&a=ffday=*px+1;int *px=&x,int*pa=&apa=ffdaprintf(%d"*px);int*pa=a,printf("a=%d\n",a);&pa=ffdcd=sqrt(double)*px);char*pc=&c;printf(**pa=%din"*pa);*px=0;printf("&a=%xln",&a);*px+=1;printf("pa=%xln",pa);(*px)++;printf("&pa=%xln",&pa)*px++;
《C 语言程序设计》教案 No.7-4 (二)注意事项 1.指针名的命名规则同用户自定义标识符; 2.同一行中可以定义多个同类型的指针,之间用逗号分开; 3.指针名前必须加“*”; 二、初始化 (一)一般形式 数据类型标识符 *指针名=初始地址值; (二)注意事项 1.初始化是针对指针变量; 2.把变量地址赋给指针变量时,该变量事先必须已定义; 3.指针目标变量的数据类型必须与指针的数据类型一致; double x; int px=&x; (/*数据类型不一致*/×) 4.可以把一个指针的值赋给另一指针; int x; int *p=&x; int *q=p; 5.不能把一般的整数数据赋给指针,但可以初始化为空指针; int *px=0; 6.不能用动态型变量地址初始化一个静态或全局变量类型的指针; (三)应用举例 指出下列个语句的执行情况: #include main() { int a=5; int *pa=&a; printf(“a=%d\n”,a); printf(“*pa=%d\n”,*pa); printf(“&a=%x\n”,&a); printf(“pa=%x\n”,pa); printf(“&pa=%x\n”,&pa); } &pa=ffdc pa=ffda &a=ffda *pa=5 a=5 结果为: int x,y,d; char *pc=&c; int *pa=a; int *px=&x; int x,a[10]; char c; int *px=&x; y=*px+1; printf(“%d”,*px); d=sqrt((double)*px); *px=0; *px+=1; (*px)++; *px++;

No.7-5第七讲指针5.3指针的运算三种运算:算术运算关系运算赋值运算二、指针的算术运算(一)与整数加减运算1.形式p±n实际地址:(p)±n×sizeof(指针数据类型)2.含义指针指向当前指向位置的前或后方第n个数据位置3.说明计算结果取决于指针的数据类型(int *px)(float*pf)pf-2*(pf-2)px-2-*(px-2)pf-1px-1—*(pf-1)*(px-1)pf-*pfpx -*pxpf+1*(pf+1)px+1*(px+1)pf+22*(pf+2)px+2+*(px+2)
第七讲 指 针 No.7-5 5.3 指针的运算 三种运算: 算术运算 关系运算 赋值运算 一、指针的算术运算 (一)与整数加减运算 1.形式 p±n 实际地址: (p)±n×sizeof(指针数据类型) 2.含义 指针指向当前指向位置的前或后方第 n 个数据位置 3.说明 计算结果取决于指针的数据类型 (int *px) px px+1 px+2 px-1 px-2 *px *(px+1) *(px+2) *(px-1) *(px-2) (float *pf) *pf *(pf+1) *(pf+2) *(pf-1) *(pf-2) pf pf+1 pf+2 pf-1 pf-2

No.7-6《C语言程序设计》教案(二)加1和减1运算intx, y,*px,1.含义px=&x,加1:指向下一个数据位置/*y=*(px++)*/y=*px++,/*y=*(++px)*/y=*++px;减1:指向前一个数据位置/*先赋值,后加1*/y=(*px)++;2.举例/*y=x++*/y=++(*px),(三)指针相减运算两个指针之间数据的个数px-py=((px)-(py))/sizeof(指针目标变量的数据类型)px=2048,py=1024,目标变量为double型px-py=(2048-1024)/8=128程序举例:使用指针编程实现,统计输入字符串中的字符个数#includemainO(char buf[256];char*p;p=buf;printf(ln Enter a string:");scanf(%s",buf);while(*p++);printf("In The string length:%d",p-buf-1);1二、关系运算两个相同数据类型的指针之间进行关系运算, >=, I=三、指针的赋值运算1.把变量的地址赋给与其具有相同数据类型的指针intx,*px;px=&x;2.相同类型的两指针相互赋值
《C 语言程序设计》教案 No.7-6 (二)加 1 和减 1 运算 1.含义 加 1:指向下一个数据位置 减 1:指向前一个数据位置 2.举例 (三)指针相减运算 两个指针之间数据的个数 px-py=((px)-(py))/sizeof(指针目标变量的数据类型) px=2048,py=1024,目标变量为 double 型 px-py=(2048-1024)/8=128 程序举例: 使用指针编程实现,统计输入字符串中的字符个数 #include main() { char buf[256]; char *p; p=buf; printf(“\n Enter a string:”); scanf(“%s”,buf); while(*p++); printf(“\n The string length: %d”,p-buf-1); } 二、关系运算 两个相同数据类型的指针之间进行关系运算 ,>=,!= 三、指针的赋值运算 1.把变量的地址赋给与其具有相同数据类型的指针 int x, *px; px=&x; 2.相同类型的两指针相互赋值 int x, y, *px; px=&x; y=*px++; /*y=*(px++)*/ y=*++px; /*y=*(++px)*/ y=(*px)++; /*先赋值,后加 1*/ y=++(*px); /*y=x++*/

第七讲指针No.7-7float *px,*py,y;px=&y;py=px;3.把数组的地址赋给具有相同数据类型的指针:doublea[30],*pa,*pb;pa=a;pb=&a[0];4.其他赋值运算px=py+n;px=py-n;px+=n,px-=n,5.4指针与数组指针和数组都可以处理内存中连续存放的数据二、访问数组元素的方法(一)使用数组名【下标]指针与数组的对应关系int y,x[10];px*px数组元素x[0]y=x[3] +x [9] ;px=x*pxpx+1*(px+1)x[1(二) 使用指针px+9x[9]*(px+9)int y,x[10],*px;px=x;(或px=&x[0];)二、说明1.X[i]、*(px+i)与*(x+i)是完全等价的表达式;2.指针是地址变量,可以进行赋值和其他运算,而数组名是地址常量,不能对其进行赋值和其他运算;3.指针在使用前必须赋初值,而数组名不需要;三、应用举例指出下面程序的执行结果:执行结果为:#includeoutput format:px[]mainO12345(int i,*px,output format: *(x+i)static int x[5]=(1,2,3,4,5);12345px=x,printf(ln output format: px[ij])n");for (i=0;i<5;i++)printf("%4d",px[i]);printf("In outputformat: *(x+i)ln");for (i=0;i<5;i++)printf(%4d"*(x+i)7
第七讲 指 针 No.7-7 float *px, *py, y; px=&y; py=px; 3.把数组的地址赋给具有相同数据类型的指针; double a[30], *pa, *pb; pa=a; pb=&a[0]; 4.其他赋值运算 px=py+n; px=py-n; px+=n; px-=n; 5.4 指针与数组 指针和数组都可以处理内存中连续存放的数据 一、访问数组元素的方法 (一)使用数组名[下标] 指针与数组的对应关系 int y,x[10]; y=x[3]+x[9]; (二)使用指针 int y,x[10],*px; px=x;(或 px=&x[0];) 二、说明 1.X[i]、*(px+i)与*(x+i)是完全等价的表达式; 2.指针是地址变量,可以进行赋值和其他运算,而数组名是地址常 量,不能对其进行赋值和其他运算; 3.指针在使用前必须赋初值,而数组名不需要; 三、应用举例 px *px 数组元素 px=x *px x[0] px+1 *(px+1) x[1] . . . px+9 *(px+9) x[9] 指出下面程序的执行结果: 执行结果为: #include output format: px[i] main() 1 2 3 4 5 {int i,*px; output format: *(x+i) static int x[5]={1,2,3,4,5}; 1 2 3 4 5 px=x; printf(“\n output format: px[i]\n”); for (i=0;i<5;i++) printf(“%4d”,px[i]); printf(“\n output format: *(x+i)\n”); for (i=0;i<5;i++) printf(“%4d”,*(x+i)); }

No.7-8《C语言程序设计》教案说明5.5字符指针和字符串字符指针是C语言中一、字符指针的含义使用最多数据类型为char型的指针的类型,几乎所有的二、初始化字符串处理都通过1.定义同时初始化指针实现char*p="this is a string";2.利用赋值语句初始化char *s;s="string",3.说明不论采用那种方法,均把字符串首地址给指针,而不是把字符串复制到指针中4.应用举例编程用指针实现求字符串长度,并输出该字符串#includeint len=0;运行结果为:main()char*s=“aaaaaa bbbb cccc"length=151while(*s!="10')string is:I am a studentint len=0;$++;char *s="I am a student.len++;while(*s!="10)(s++;len++;)s-=len, s-=len;printf("In length=%dinstring is:%sln"len,s)输出长度和字符串35.6指针数组二、指针数组具有相同数据类型的指针变量的集合二、指针数组应用举例编程,用指针数组实现输入星期号码,输出英文名称
《C 语言程序设计》教案 No.7-8 5.5 字符指针和字符串 一、字符指针的含义 数据类型为 char 型的指针 二、初始化 1.定义同时初始化 char *p= “this is a string”; 2.利用赋值语句初始化 char *s; s= “string”; 3.说明 不论采用那种方法,均把字符串首地址给指针,而不是把字符串 复制到指针中 4.应用举例 编程用指针实现求字符串长度,并输出该字符串 5.6 指针数组 一、指针数组 具有相同数据类型的指针变量的集合 二、指针数组应用举例 编程,用指针数组实现输入星期号码,输出英文名称 说明 字符指针 是 C语言中 使用最多 的类型,几 乎所有的 字符串处 理都通过 指针实现 #include main() { int len=0; char *s=”I am a student.” while(*s!=’\0’) {s++;len++;} s-=len; printf(“\n length=%d\nstring is:%s\n”len,s); } int len=0; 运行结果为: length=15 string is:I am a student. char *s= “aaaaaa bbbb cccc” while(*s!=’\0’); s++; len++; s-=len; 输出长度和字符串

第七讲指针No.7-9mainOint week,1char*weekname[8];int week;while(1);char *weekname-{"""Monday""Tuesday""Wednesday""Thursday""Friday""Saturday""Sunday"};while(1)结束printf("nenter week number:");输出英文名scanf("%d",&week);if((week>=1)&&(week<=7)prinf("nweek%d:s",week,weekname[week]);elseprintf("In Run end!"),break,315.8命令行参数一、命令行及参数copy filel file2del filenamecopy/del:命令名file、1file2/filename:参数二、将参数传递给主函数(一) 格式说明:main(argc,argv)argc:命令行中元素总数;int argc;*argv:指针数组argv[0]:命令名char *argv[];argv[1]:参数1(argv[2]:参数2使用传递的参数1
第七讲 指 针 No.7-9 5.8 命令行参数 一、命令行及参数 copy file1 file2 del filename copy/del:命令名 file、1file2/filename:参数 二、将参数传递给主函数 (一)格式 main(argc,argv) int argc; char *argv[]; { 使用传递的参数 } main() { int week; char *weekname[]={“”,”Monday”,”Tuesday”, “Wednesday”,”Thursday”,”Friday”, “Saturday”,”Sunday”}; while(1) { printf(“\nenter week number:”); scanf(“%d”,&week); if((week>=1)&&(week<=7)) prinf(“\nweek%d: s”,week,weekname[week]); else { printf(“\n Run end!”); break; } 输入 week; 变为相应英文名; int week; char *weekname[8]; while(1); 输出英文名 结束 } 说明: argc:命令行中元素总数; *argv[]:指针数组 argv[0]:命令名 argv[1]:参数 1 argv[2]:参数 2

No.7-10《C语言程序设计》教案(二)举例编程实现命令行参数的输出#includemain(argc,argv)int argc;char *argv[];tint i;printf("argc=%din",argc);printf("Comand name:%sIn",argv[o]);for (i-l;iechowelcomewordpeace执行该程序的结果为:Argc=4Comand name:echoArgument No.l:welecomeArgument No.2:wordArgument No.3:peace【自学部分]多级指针、P150指针应用举例小结1.指针的含义、定义方法、初始化和运算2.指针与数组3.字符型指针与字符串4.指针数组5.命令行参数及传递独立作业题1.什么是指针?如何定义指针?如何对其初始化?
《C 语言程序设计》教案 No.7-10 (二)举例 编程实现命令行参数的输出 #include main(argc,argv) int argc; char *argv[]; { int i; printf(“argc=%d\n”,argc); printf(“Comand name:%s\n”,argv[0]); for (i=1;iecho welcome word peace 执行该程序的结果为: Argc=4 Comand name:echo Argument No.1:welecome Argument No.2:word Argument No.3:peace [自学部分]多级指针、P150 指针应用举例 小 结 1.指针的含义、定义方法、初始化和运算 2.指针与数组 3.字符型指针与字符串 4.指针数组 5.命令行参数及传递 独立作业题 1.什么是指针?如何定义指针?如何对其初始化?

第七讲指针No.7-112.若px为指针,则px、*px、&px各自的含义是什么?3.指针可以进行哪些运算?如何进行运算?4什么是字符型指针?若用字符串给字符型指针初始化,是否是把字符串也复制到了字符型指针变量?5.什么是指针数组?6.如何向主函数传递命令行参数?7.教材P151思考与练习(3.5.(1)(2)(3)(4))上机实作一、正确理解指针含义输入教材P128例5.1,观察运行结果二、指针运算输入下面的程序,并观察结果的变化并分析原因#includemain()1int y,*px,x[)=(1,3,5,7,9,11,13);px=x,执行结果为:printf("&y=%xln",px);&y=ffc8printf("&y=%xln",&px)&y=ffc6printf(y=%d)n",*px);px=px+5;y=1printf(“&y=%xin",px);&y=ffd2printf(&y=%xln",&px)&y=ffc6printf(y=%din",*px);y=11y=*px++;printf(y=%din",*px);y=13y=*++px;y=15printf("y=%din"*px);y=16y=(*px)++;printf(“y=%d)n",*px);y=17y=++(*px);printf("y=%d)n",*px);三、编程并运行教材P151思考与练习(5.(1)(2)(3)(4))
第七讲 指 针 No.7-11 2.若 px 为指针,则 px、*px、&px 各自的含义是什么? 3.指针可以进行哪些运算?如何进行运算? 4.什么是字符型指针?若用字符串给字符型指针初始化,是否是把 字符串也复制到了字符型指针变量? 5.什么是指针数组? 6.如何向主函数传递命令行参数? 7.教材 P151 思考与练习(3.5.(1)(2)(3)(4)) 上 机 实 作 一、正确理解指针含义 输入教材 P128 例 5.1,观察运行结果 二、指针运算 输入下面的程序,并观察结果的变化并分析原因 三、编程并运行 教材 P151 思考与练习(5.(1)(2)(3)(4)) #include main() { int y,*px,x[]={1,3,5,7,9,11,13}; px=x; printf(“&y=%x\n”,px); printf(“&y=%x\n”,&px); printf(“y=%d\n”,*px); px=px+5; printf(“&y=%x\n”,px); printf(“&y=%x\n”,&px); printf(“y=%d\n”,*px); y=*px++; printf(“y=%d\n”,*px); y=*++px; printf(“y=%d\n”,*px); y=(*px)++; printf(“y=%d\n”,*px); y=++(*px); printf(“y=%d\n”,*px); } 执行结果为: &y=ffc8 &y=ffc6 y=1 &y=ffd2 &y=ffc6 y=11 y=13 y=15 y=16 y=17