计算机教育中的C程序设计的指针探讨

2022-09-12

1 指针概念

通常, 变量是用来存储数据, 所存储的数据被称为变量的值。在程序中定义一个变量, 系统会在内存中为其分配一块连续存储单元用来存储数据, 并把这块连续存储单元的首地址作为该变量的地址。通常把这个地址称为指针, 即指针是常量。指针的引入为系统存取数据提供了一种“间接访问”方式。所谓间接访问, 是先访问存放变量地址的存储单元, 得到该变量的地址, 再对变量内容进行访问。

指针变量是一种特殊变量。系统为指针变量分配一块连续存储单元不是供其存储数据, 而是存储内存地址。因此, 指针变量是存储内存地址的变量。

2 指针类型

指针变量定义的一般格式:类型说明符*指针变量名;其中类型说明符表示指针变量所指向变量的类型, 而不是指针变量的类型, 因为不管是整型、字符型还是实型指针变量都是用来存放地址, 所以指针变量就其本身来说没有类型之分。

一个指针变量只能指向同一种类型变量。因为不同数据类型所占存储单元字节数不同, 如果指针变量和它所指向目标变量的数据类型不同时, 对指针变量进行运算将可能得不到正确目标变量的地址。例如:一个字符型指针变量在执行“++”运算时所指向的地址是增加1个字节, 而一个长整型指针变量则增加4个字节。如果长整型指针变量指向字符型变量, 则执行“++”运算将得不到下一个元素的地址。例如:

分析:p指向字符串“abcdefgh”, 当把p强制转换成long型赋值给q时, 使p、q指向同一字符串的首地址。因为q是长整型指针, 自加时地址值是加上4个字节使q指向字符串中第5个字符, 再把q强制转换成char型赋值给r, 故输出“efgh”。

3 指针应用中常见的错误

3.1 把数据赋给指针变量

指针在使用前必须进行初始化, 赋予指针的值必须是地址。

分析:编程新手常犯这种错误, 他们没有掌握指针的概念, 习惯于把数据作为右值。正确语句:p=&a;, “&”是一个取变量地址的运算符。

3.2 指针常量运算错误

程序中常量指针是不能被修改的。典型有数组名指针常量和指向字符串常量的指针。

分析:C语言中数组名是一个指针常量, 代表数组的首地址。该程序错误之处在于printf (“%dn”, * (++a) ) ;语句中++a试图对a这个指针常量进行修改。正确语句:printf (“%dn”, * (++p) ) ;

3.3 用指针修改静态存储区域数据

分析:没有正确区分数组和指针的异同。当把字符串常量赋给指针变量时, 该字符串常量以数组形式存储在静态存储区中, 而指针采用动态内存分配方式, 故不能用指针修改。正确语句:char a[]=”boat”;a[0]=’c’;。

3.4 指针赋值类型不一致

分析:该程序错误之处在p=a;虽然p和a都是指针类型, 但p是一级指针, a指向行, 是二级指针, 赋值号两边指针类型不一致。a[0]指向列, 是一级指针。正确语句:p=a[0];或p=&a[0][0];如果一定把a赋值给p, 必须先将a转换成整型指针类型, 如:p= (int*) a;。特别是将多维数组赋值给指针变量时应注意类型匹配。

3.5 企图通过指针参数传递内存

分析:函数中局部变量的存储空间在栈上分配, 函数调用结束后, 该存储空间对主调函数中指针p不可用。应通过函数返回值来传递动态内存。正确语句:p=fun () ;int fun () ;, 加上语句return p;。

3.6 结构体指针变量赋值前未分配内存

有一类程序, 编译、链接时并无任何错误, 但却无法执行或能执行但却随时会崩溃。例如:

分析:数组s[3]中各元素都是struct stu类型的结构体指针变量, 在对其赋值之前未分配内存。应该用malloc () 函数给该变量申请内存之后, 并立即检查指针值是否为0。正确语句:s[I]= (struct stu*) malloc (3) ;

指针是c语言编程的精髓, 利用它可以编写出颇有特色、质量优良的程序, 实现许多用其它高级语言难以实现的功能。但指针使用实在太灵活, 十分容易出错。只有在编程过程中不断总结指针的使用技巧, 通过在实践中不断摸索, 才能准确无误地驾驭指针。

摘要:指针是C语言中特性较强功能较好的应用之一, 然而指针也是最不易理解和掌握的概念。本文阐述了指针、指针变量的概念以及指针类型, 结合具体实例对指针的类型进行了分析, 并对指针在实际应用中常出现的问题进行了归类总结, 以便于掌握指针的使用技巧, 准确无误地驾驭指针。

关键词:C,语言,指针,结构体

参考文献

[1] 赵森, 李卓民, 等.C程序设计[M].北京:冶金工业出版社, 2005.

[2] 谭浩强.C程序设计[M].北京:清华大学出版社, 1999.

上一篇:试论质量技术监督工作中的抽样检查下一篇:浅谈两河口水电站工程总承包模式下的安全管理