C语言程序设计教案 第十章指针

  • 格式:doc
  • 大小:199.50 KB
  • 文档页数:28

下载文档原格式

  / 28
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十章指针

课题:第十章指针§1-§2

教学目的:1、了解指针与地址的概念

2、掌握指针变量的定义、初始化及指针的运算

教学重点:教学难点:指针变量的定义、初始化及指针的运算指针的运算

步骤一复习引导

指针是C语言的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;能直接处理内存地址等,这对设计系统软件是很必要的。

指针的概念比较复杂,使用也比较灵活,因此初学者时常会出错,务请在学习本章内容时十分小心。

步骤二讲授新课

§10.1 地址和指针的概念

计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这个编号即地址。

例:i =3; 或scanf(“%d”, &i);

是将3送给i所在的空间。

例:将3送到变量I_pointer所“指向”的单元(即I所标志的单元)。

所谓“指向”,是通过地址来体现的,I_pointer中的值为2000,它是变量I 的地址,这样就在I_pointer和变量之间建立起一种联系,即通过I_pointer能知道I的地址,从而找到变量I 的内存单元。因而在C语言中,将地址形象化地称为“指针”。

意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。

内存单元的地址和内存单元的内容是两个不同的概念。

指针:就是地址,即内存单元的编号。

指针变量:用来存放另一变量的地址(即指针)的变量。

如:地址2000是变量i的指针;i_pointer是指针变量,其值就是指针2000。

§10.2变量的指针和指向变量的指针变量

变量的指针就是变量的地址。

存放变量地址的变量是指针变量,用来指向另一个变量。

*i_pointer 表示i_pointer 所指向的变量。

一、定义一个指针变量

指针变量的定义包含三个方面的内容:

⑴指针类型说明,即定义变量为一个指针变量

⑵指针变量名

⑶变量值(指针)所指向的变量的数据类型。

格式:存储类型基类型*指针变量名;

例:int *pointer_1, *pointer_2;

float *pointer_3;

char *pointer_4;

二、指针的引用

指针变量有两个运算符:

& :取地址运算符

功能:取变量地址;单目,右结合。

* :取内容运算符(“间接访问”运算符)

功能:只能跟地址,取变量所指向单元的内容;单目,右结合。

例:&a为变量a的地址,

*p 为指针变量p所指向的存储单元。

例:int a=5, *p=&a;

printf ( “%d”, *p );

main()

{ int a,b;

int *pointer_1,*pointer_2;

a=100;b=10;

pointer_1=&a; /*把变量a的地址赋给pointer_1*/

pointer_2=&b; /*把变量b的地址赋给pointer_2*/

printf(“%d,%d\n”,a,b);

printf(“%d,%d\n”,*pointer_1, *pointer_2);

}

输出结果:100, 10

100, 10

评注:

1、在第3行虽然定义了两个指针变量,只是提供了两个指针变量,但并未指向任何一个整型变量。称为指针“悬空”。

2、最后一行的*pointer_1和pointer_2就是变量a和b。

3、程序中两处出现*pointer_1等,含义不同。程序第3行中的*pointer_1表示定义指针变量pointer_1。它前面的*只是表示该变量是指针变量。程序最后一行中的*pointer_1则代表变量,即pointer_1所指向的变量。

4、第5行中的pointer_1=&a 是将a的地址赋给指针变量pointer_1,而不是*pointer_1。

注意:不应写成:*pointer_1=&a;

5、从上例中可看出,*pointer_1等价于a,*pointer_2等价于b,故凡在程序中出现a的地方均可用*pointer_1 代替。所以,若有:int x, y, *px=&x ;

则下面的运算均是正确的:y=*px+1; /*把x 的内容加1 送变量y*/

printf(“%d\n”, px ); /*打印当前x 的内容*/

d=sqrt((double) px); /*把x的平方根送变量d*/

px=0; /*把x 置为0*/

*px+=1; /*把x 的值加1*/

(*px)++; /*使x 的值加1*/

y=(*px)++; /*即y=x, x++*/

6、假设px和py都被定义为指向int 对象的指针,而且px当前已指向了int 型变量x,则执行:

py=px; /*把指针px的内容拷贝到指针py中去*/

即py和px 这两个不同的指针指向了同一对象x

7、指针不是整数,不能将它与整数混为一谈。

例:

# include

main()

{ int x=100,*p;

p=x;

printf(“%d”, p );

}

例如:

# include

main()

{ int a, b, *d=&a;

b = d;

printf( “%d \n”, b );

……

}——编译不出错,但得不到希望的值

关于&和*运算符的说明:

假设已执行pointer_1=&a;

1、&*pointer_1含义是什么?

&*pointer_1与&a相同,即变量a的地址。

2、*&a的含义是什么?

先进行&a运算,得a的地址,再进行*运算。

*&a、*pointer_1及变量a等价。

3、(*pointer_1) + + 相当于a + +。

它与*pointer_1 + + 不同。

4、*pointer_1 + + 等价于*(pointer_1 + +),即先进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。

例10.2:输入a和b两个整数,按先大后小的顺序输出a和b。

main()

{ int *p1,*p2,*p, a, b;

scanf(“%d,%d”,&a,&b);

p1=&a; p2=&b;

if (a

{p=p1; p1=p2; p2=p;}

printf(“\n a=%d,b=%d\n”,a,b);

printf(“max=%d,min=%d\n”,*p1,*p2);

}

运行情况:

5,9

a=5,b=9

max=9,min=5

三、指针变量作为函数参数

例10.3对输入的两个整数按大小顺序输出。