• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
C语言教程:第六章:指针(3)
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
C语言教程:第六章:指针(3)
软件发布 C语言教程:第六章:指针(3)
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 认证考试 >> 计算机等级考试 >> 计算机等级考试动态 >> C语言教程:第六章:指针(3)

C语言教程:第六章:指针(3)

添加时间: 2007-5-25 7:05:11  作者: 计算机等级考试认证参考  阅读次数:37   来源: http://www.d9soft.com

       

 
使用字符串指针变量与字符数组的区别   

用字符数组和字符指针变量都可实现字符串的存储和运算。 但是两者是有区别的。在使用时应注意以下几个问题:   

1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。   

2. 对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st[]={“C Language”};而对字符串指针变量则无此限制,如: char *ps="C Language";   

3. 对字符串指针方式 char *ps="C Language";可以写为: char *ps; ps="C Language";而对数组方式:    
static char st[]={"C Language"};   
不能写为:   
char st[20];st={"C Language"};   
而只能对字符数组的各元素逐个赋值。   

  从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。前面说过,当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。因此,    
char *ps="C Langage";   
或者 char *ps;   
ps="C Language";都是合法的。   

函数指针变量   

  在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量, 使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。 我们把这种指向函数的指针变量称为“函数指针变量”。   
函数指针变量定义的一般形式为:   
类型说明符 (*指针变量名)();    
其中“类型说明符”表示被指函数的返回值的类型。“(* 指针变量名)”表示“*”后面的变量是定义的指针变量。 最后的空括号表示指针变量所指的是一个函数。   
例如: int (*pf)();   
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。   
下面通过例子来说明用指针形式实现对函数调用的方法。   
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: ");   
scanf("%d%d",&x,&y);   
z=(*pmax)(x,y);   
printf("maxmum=%d",z);   
}   
  从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:1. 先定义函数指针变量,如后一程序中第9行 int (*pmax)();定义pmax为函数指针变量。   

2. 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;   

3. 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y); 调用函数的一般形式为: (*指针变量名) (实参表)使用函数指针变量还应注意以下两点:   

a. 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。   

b. 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。    #p#

指针型函数   

前面我们介绍过,所谓函数类型是指函数返回值的类型。 在C语言中允许一个函数的返回值是一个指针(即地址), 这种返回指针值的函数称为指针型函数。   
定义指针型函数的一般形式为:    
类型说明符 *函数名(形参表)    
{    
…… /*函数体*/   
}    
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。   
如:   
int *ap(int x,int y)   
{   
...... /*函数体*/   
}   
  表示ap是一个返回指针值的指针型函数, 它返回的指针指向一个整型变量。下例中定义了一个指针型函数 day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name 数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中, 把输入的整数i作为实参, 在printf语句中调用day_name函数并把i值传送给形参 n。day_name函数中的return语句包含一个条件表达式, n 值若大于7或小于1则把name[0] 指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序, exit(0)表示正常退出。   

  应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。int(*p)()是一个变量说明,说明p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。int *p() 则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明, 在括号内最好写入形式参数,这样便于与变量说明区别。 对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。   
main(){   
int i;   
char *day_name(int n);    
printf("input Day No: ");   
scanf("%d",&i);   
if(i<0) exit(1);   
printf("Day No:%2d-->%s ",i,day_name(i));   
}   
char *day_name(int n){   
static char *name[]={ "Illegal day",   
"Monday",   
"Tuesday",   
"Wednesday",   
"Thursday",   
"Friday",   
"Saturday",   
"Sunday"};   
return((n<1n>7) ? name[0] : name[n]);   
}   
  本程序是通过指针函数,输入一个1~7之间的整数, 输出对应的星期名。指针数组的说明与使用一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。   
  指针数组说明的一般形式为: 类型说明符*数组名[数组长度]    
  其中类型说明符为指针值所指向的变量的类型。例如: int *pa[3] 表示pa是一个指针数组,它有三个数组元素, 每个元素值都是一个指针,指向整型变量。通常可用一个指针数组来指向一个二维数组。 指针数组中的每个元素被赋予二维数组每一行的首地址, 因此也可理解为指向一个一维数组。图6—6表示了这种关系。    #p#
int a[3][3]={1,2,3,4,5,6,7,8,9};   
int *pa[3]={a[0],a[1],a[2]};   
int *p=a[0];   
main(){   
int i;   
for(i=0;i<3;i++)   
printf("%d,%d,%d ",a[i][2-i],*a[i],*(*(a+i)+i));   
for(i=0;i<3;i++)   
printf("%d,%d,%d ",*pa[i],p[i],*(p+i));   
}   
  本例程序中,pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。读者可仔细领会元素值的各种不同的表示方法。 应该注意指针数组和二维数组指针变量的区别。 这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。

 

上下文章:

 

上一篇文章: C语言教程:第六章:指针(4) 下一篇文章: 2005年全国计算机等级考试三级网络技术考试大纲

相关文章:

  • PS教程:神奇 用Photoshop让美女走出画框
  • PS教程:看看如何用Photoshop把照片演变成水墨画
  • Photoshop教程:教你如何创出发丝的炫彩莹亮效果
  • 彻底DIY Vista主题制作教程(上)
  • 详解VLAN+路由器典型配置实例教程

相关软件:

  • 金梅电影程序第六版(美化版)
  • C语言资料大全 1.0
  • 易语言程序运行环境 4.11
  • 极品五笔教程 2007
  • C语言学习系统 V4.1
  • iTunes V7.6.2 多语言版

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

计算机等级考试分类导航

  • 计算机等级考试动态
  • 计算机一级考试
  • 计算机二级考试
  • 计算机三级考试
  • 计算机四级考试

本类经典文章推荐

  • 全国计算机等级考试三级网络技术(...
  • 三级网络技术复习笔记(第1-2章)
  • 三级笔试样题(PC技术)
  • 三级数据库技术样题
  • 三级网络技术复习笔记(5-7)
  • 三级网络技术复习笔记(第3-4章)
  • 笔试样题(网络技术)
  • 机考如何避免范围性错误
  • 2003年最新三级网络模拟题(2)
  • 全国计算机等级考试三级网络技术部...

计算机等级考试动态阅读排行

  • 计算机等级考试:VFp练习题1
  • 全国计算机等级考试三级网络技术(...
  • 完整的计算机等级考试上机模拟系统
  • 计算机等级考试:VFp练习题2
  • 历年操作系统论述题及答案(2)
  • 三级网络技术复习笔记(第1-2章)
  • 上海:计算机等级考试开始报名
  • 计算机二级VB软件环境、考试时间、...
  • 2005年全国计算机等级考试全真模拟...
  • 职称计算机考试报名今年最后一次

计算机等级考试阅读总排行

  • 全国计算机等级考试一级模拟试题01
  • 全国计算机等级考试一级模拟试题10
  • 全国计算机等级考试一级模拟试题08
  • 全国计算机等级考试一级考试最新模...
  • 全国计算机等级考试一级模拟试题07
  • 全国计算机等级考试一级模拟试题02
  • 全国计算机等级考试一级模拟试题06
  • 全国计算机等级考试一级模拟试题03
  • 一级(WINDOWS)试题解析-Word篇
  • 全国计算机等级考试上机考试应试技...

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有