指针2

指针除了可以和一维数组、二维数组进行结合,也可以作为函数的返回值或者指向一个函数。下面就从这两个方面入手,看看指针与函数的有趣结合。

指针作为函数返回值

函数作为C语言的基本组成模块,包括函数首部和函数体两部分。函数首部由函数返回值类型、名字、参数类型、参数等组成;函数体又可以分为说明语句与执行语句。

1
2
3
4
5
返回值类型 函数名(形参类型 形参)//函数首部
{ //函数体
说明语句
执行语句
}

其中返回值类型除了几种基本数据类型以外,还可以返回一个指针值,则该函数就称为指针类型的函数。
例如:

int *fun(int x)

该函数名为fun,fun两侧的运算符分别为“”和“()”,
由于“()”的优先级高于“
”,故fun()首先代表一个函数
,然后与前面的“*”结合,表示返回值是一个指针,而int则表示该指针指向的数据类型为整型,即返回值为指向整型变量的指针类型。常见的返回指针值的函数有字符串复制函数。

1
2
3
4
5
6
7
8
9
10
11
12
char *strcpy(char *s1,char *s2)
{
char *p=s1;
while(*s1++=*s2++);
return p;

}
void main()
{
char s[20]="welcome";
printf("%s\n",strcpy(s,"you"));
}

运行结果为:

you

指针指向一个函数

在说明这个问题之前,先对函数在内存中的存储做个简单的介绍。指针之所以可以指向函数,是因为函数被分配在代码区一段连续的内存里面,函数名称存储的为该内存块的入口地址,故可以使用指针来调用函数。
当函数被调用时,函数的形参从右至左依次压入栈中,且连续。因此对于不确定参数个数的函数,只要取得了第一个形参的地址,就可以依次取得后面参数的值。这也是printf函数能够格式化打印任意个数变量值的原因,其参数从右至左依次压栈,输出时从左至右依次弹出。下面以
求n个数的最大值为例:

1
2
3
4
5
6
7
8
9
10
11
12
int max(int n,int ...)
{
int maxnum = *(&n+1);
for(int i=2;i<=n;i++)
{
if(maxnum<(*(&n+i)))
maxnum = *(&n+i);

}
return maxnum;

}

其中n为要输入参数的个数,(&n+1)就得到了第一个待
比较数字的值,
(&n+i)就得到了第i个待比较数字的值,i一直取到n。

下面继续,指向函数的指针变量的定义如下:

int (*p)();

首先(*p)说明p是一个指针变量,后面的()则代表了该指针指向为某一个函数,而int代表了该函数的返回值后为整型。
使用函数对该指针变量进行赋值操作:

p = funname;

则可以使用(*p)代替函数名funname进行函数调用。

------ 本文结束------
  • 文章标题: 指针2
  • 本文作者: 你是我的阳光
  • 发布时间: 2020年03月19日 - 09:11:34
  • 最后更新: 2021年08月03日 - 16:24:00
  • 本文链接: https://szp2016.github.io/c/指针2/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
0%