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


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

用字符数组和字符指针变量都可完成字符串的存储和运算。 可是两者是有区别的。在利用时应留心以下几个问题:

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:--->%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之间的整数, 输出对应的星期名。指针数组的阐明');与利用一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的鸠合。 指针数组的全数元素都必需是具有沟通存储规范和指向沟通数据规范的指针变量。



版权声明: 原创作品,答应转载,转载时请务必以超链接情势标明文章 原始来因 、作者信息和本声明。不然将深究法令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975590.html