C语言指针在教学中的基础应用
C Language Pointer in the Teaching of Basic Application
CHEN Jing-yan1 , CHEN Yue-bin2
(1.Medical College of Shantou University, Shantou 515041, China; 2.Zengcheng College of South China Normal
University, Guangzhou 511363, China)
:It can be said that the pointer is the soul of the
C language, familiar and flexible use of the pointer, you can effectively represent complex data structures; dynamic memory; the use of string; arrays are very effective.
Beginners often an error, how to enable students to acquire and in-depth learning pointer is a difficult and often requires some time. The following combination of experience, discuss and summarize the pointer problem.
C语言是一种计算机程序设计语言,是目前最广泛使用的计
算机语言之一,也是各高校专业与非专业主要的计算机教学语
指针是C语言中最为复杂的一个部分,使用起来非常灵活,
因而学习时常出错,必须小心,多思考,多比较,在实践中把其掌握好。
1指针概念
指针变量简称指针,其实它也是变量,只不过里面存放的内
容是一个地址, 这个地址指向另外一个变量。
指针就是内存的地址,必须弄清楚数据在内存中是如何存储与读取的; 内存单元地址与内存单元内容是两个不同的概念。
内存单元地址就像宾馆每
个房间一样,其房间号就是其地址,单元内容可以理解为房中的
宾客;如图 1 所示:假设程序定义了三个变量a、b、c,编译时
系统分配1000和10001两个字节给a, 1002和1003给b, 1004 和 1005 给c 。
由此可以知道,地址是用来标识每一个存储单元,是用户对存储单元中的数据的访问,在C语言中形象的将地址叫做指针, 它可以用来指向变量、数组、结构体、和多级指针等等。
对于表达式、常量或者是寄存器变量则不能用指针来指向。
2指针变量的定义和引用
2.1指针变量的定义
C语言规定指针变量在使用之前必须被定义,遵循先定义后使用的原则, 定义指针变量与一般变量定义开式相似, 也是用说明语句来实现的, 但不同于其他类型变量的就是它是用来专门存放地址的。
指针变量定义的一般开式为
类型标识符 * 指针变量名;
面都是合法的定义:
int *g1,*g2,*g3 ;定义g1、g2、g3指向整型数据的指针变量。
float *k1 , *k2 , *k3 ;定义 k1 、 k2、 k3 指向实型数据的指
针变量。
char *m1, *m2, *m3;定义m1 m2 m指向字符型数据的指针变量 3。
在定义指针变量值得注意的是:
①“ * ”是一个指向符号,表示标识符为指针变量,上面的 g1、g2、g3等是指针变量名,而不是*g1、*g2、*g3,值得注意的是指针变量是用来存放地址的。
②一个指针变量只能指向同一个类型的变量。
由于不同类型的数据在
内存中所占的字节数不同,如果忽而指向一个整型变 量,忽而指向一个实型变量, 会使系统无法管理变量的字节数而 发生错误, 所以只有同一类型变量的地址才能放到指向该类型变 量的指针变量中。
2.2 指针变量的引用
例如:
main()
int i=10 ,
j=20;
int *g1 *g2;
g1=&i ;
g2=&j ;
printf("%d , %d\n"
,
printf("%d , %d\n"
, { i , j) ; *g1 ,
*g2) ; }
运行结果为: 10, 20
10,20
本程序定义了两个指针变量 g1和g2, “g1= &i ;和g2=&j ; ” 语句是将i 与j 的地址分别赋给g1和g2,不能写成“ *g1= &i ;
和 *g2=&j ; ”。
与指针相关的两个运符:
取地址运算符。
标值。
与“ *”运算符的优先级别相同, 按自右而左的方向结 合,如“ g1= &i ;”语句,若&*g1,先进行的是*g1的运算,再 执行 &运算。
如: *&i 的含义是什么?当然先进行 &i 运算,得到 i 的地址,再进行 *运算。
3 数组的指针与函数的指针
3.1 数组的指针
有两个概念我要必须分清。
一个是指针数组: 首先它是一个 数组,数组的元素都是指针, 数组占多少个字节由数组本身决定。
它是“储存指针的数组”的简称。
另一个是数组指针: 首先它是 一个指针,它指向一个数组。
简单举例说明:
int *p[10]; 首先声明了一个数组,数组的元素是 int 型的 指针。
②*: 指针运算符或称间接访问运算符,取指针所指向的目
&”
int (*p)[2]; 声明了一个指针,指向了一个有两个 int 元素 的数组。
其实这两种写法主要是因为运算符的优先级 , 因为 [] 的优先 级比*高。
所以第一种写法,P 先和[]结合,所以是一个数组, 后与 *结合,是指针。
后一种写法同理。
应当注意,如果数组为 int 型,指针变量也应是 int 型。
下 面是指针元素的赋值:
p=&a[0];
C 语言规定数组名代表数组的首地址, 是第一个元素的地址。
所以 p=&a[0] 与 p=a 是等价的。
注意 a 不代表整个数组, “p=a ;” 的作用是把a 数组的首地址赋给p,而不是a 的所有元素都赋给 p 。
在定义指针变量时是可以赋给初值的:
int *p=&a[0];
等效于:
int *p;
p=&a[0];
多维数组(以二维数组为例)
二维数组的定义:
a 是一个数组的名字,包含二个元素: a[0] , a[1] 。
而每个 元素又是一个一维数组,每个一维数组又包含有三个元素。
如
的三个元素分别为a[0][0] , a[0][1] , a[0][2] 。
a 代表
的是二维数组的首地址。
3.2 函数的指针 static int a[2][3]={{1 ,2,3},{4,5,6}}
a[0] 中
指针是可以指向一个函数的,在编译时被分配给一个入口地址,这个入口地址就叫做函数的指针。
在一个程序中,一个指针变量可以先后指向不同的函数。
指向函数的指针变量定义开式为:
数据类型标识符( *指针变量名)(参数 1,参数 2);
面通过例子来说明用指针形式实现对函数调用的方法。
int max(int a,int b)
if(a>b)return a;
else return b;}
main()
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
pmax为函数指针变量,并把函数入口地址赋给该函数指针变量,pmax=max调用函数的形式:(*指针变量名)(参数表)其中的 * 号不是
求值运算,它只是一种表示符号。
如本程序中的 z=( *pmax)( x,y);值得注意的是:函数指针变量与数组指针变量是不相同的,数组指针变量加减一个整数可使指针移动指向后面或前面的数组,而函数指针是没有移动的意义的
4总结
C语言指针对于初学者来说是一个短时间内很难掌握的问题,指针灵活性较大,对于刚开始学习的学生,要搞清楚指针的各个方面内容,例如:指针类型、指针所指向的类型、指针所指向的内存区,还有指针所占据的内存区等基础方面内容。
在多思考、多注重比较和多上机实践,才能真正的掌握好指针课程。