使用字符串指针变量与字符数组的区别
用字符数组和字符
指针变量都可实现字符串的存储和运算。 但是两者是有区别的。在使用时应注意以下几个问题:
1. 字符串
指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
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:\n");
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.
函数调用中"(*
指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。
指针型函数前面我们介绍过,所谓
函数类型是指
函数返回值的类型。 在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:\n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s\n",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
} 本程序是通过
指针函数,输入一个1~7之间的整数, 输出对应的星期名。
指针数组的说明与使用一个数组的元素值为
指针则是
指针数组。
指针数组是一组有序的
指针的集合。
指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的
指针变量。
posted on 2007-05-01 02:24
悲惨的狼 阅读(97)
评论(0) 编辑 收藏 引用 所属分类:
C语言第六章