扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
供参考:
成都创新互联专业为企业提供依兰网站建设、依兰做网站、依兰网站设计、依兰网站制作等企业网站建设、网页设计与制作、依兰企业网站模板建站服务,10多年依兰做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
//:
strcpyDemo.c
//author:
Problue
#include
stdio.h
#include
assert.h
/**
*
该函数将从src指向的数组中复制最多count个字符(不复制空字符后面的)到dest指向的数组中。
*
如果复制发生在两个重叠的对象中,则行为未定义。
*
如果src指向的数组是一个长度比count短的字符串,则在dest指向的数组
*
后面添加空字符.直到写入了count个字符。
*@param
dest
目标数组
*@param
src
源数组
*@return
dest
*
*/
char*
strcopy(char*
dest,
const
char*
src,
int
count)
{
char*
sc
=
dest;
assert
((dest
!=
NULL)
(src
!=
NULL));
while
(
count
*src
!=
'\0')//
复制字符
[max
count]
src
到
dest
[count]
{
*sc++
=
*src++;
--count;
}
for
(;
count;
--count)
//
写入空字符到dest
{
*sc
=
'\0';
}
return
dest;
}
typedef
char*
(*STR_FUNC)(char*,
const
char*,
int);
int
main()
{
STR_FUNC
func
=
strcopy;
const
int
A_LENGTH
=
30;
char
a[A_LENGTH
+
1];//
=
"abc";
char*
b
=
"defg";
func(a,
b,
A_LENGTH);
puts(a);
puts(b);
getchar();
return
0;
}
char *match (char*s,char ch1,char ch2)
函数各部分的含义:
第一个char,一般是代表函数的返回值是一个字符。但是它后面有一个*,应该把char和*连起来看,就是char*了。
那么,第一个就是char*,代表函数的返回值是一个字符指针(地址)。
match是函数的名字。
括号内是函数的参数,多个参数用逗号分隔。本例共有3个参数:char*s,char ch1,char ch2,第一个是s,类型为char*型(字符指针型),后两个ch1、ch2都是char型(字符型)。
到这儿,你就知道去掉*match前的*为什么就不对了。
另外,括号里参数类型(如包含指针)跟函数返回值的类型无关。函数名前加不加*只与函数返回值的类型有关。
有函数: int fun(int a,int b);
要定义指向该函数的指针
对比指向 int a; 的指针
int *p; p = a;
p的定义是怎么来的?
首先要保证p是一个指针类型
写下(*p),
然后,考虑下p的基类型,
p的基类型就是变量a的类型int
将int 放在(*p)前面就行了
int (*p);
括号可以省略,就成了 int *p;
同理
想要实现 pf = fun;
(*pf) 将pf定义为一个指针,
将fun的类型作为pf的基类型
fun相当于一个 int (int a,int b)类型的量
int (int a,int b) (*pf);
基类型中有圆括号和中括号要后移
int (*pf)(int a,int b) ;//括号不能省略
pf = fun;
调用时
(*pf)(3,4); pf(3,4)都可以
一、定义一个函数指针的方法如下:
返回值类型 (* 指针变量名)([形参列表]);
1、int func(int x); /* 声明一个函数 */
2、int (*f) (int x); /* 声明一个函数指针 */
3、f=func; /* 将func函数的首地址赋给指针f */
二、函数指针的用法:
函数指针的应用:(*指针变量名)(参数列表)
如:int c=(*ptr)(a,b);/* 函数指针 的使用*/
在C语言中,函数本身不是变量,但是可以定义指向函数的指针,也称作函数指针,函数指针指向函数的入口地址。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。
扩展资料:
指针函数和函数指针的区别:
1、这两个概念都是简称,指针函数是指返回值是指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
2、返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。
参考资料来源:百度百科-指针
参考资料来源:百度百科-函数指针
函数指针告诉CPU下一步需要执行哪里的代码的指针, 一数组十分相像.
#include stdio.h
void function(int i, double d) //一个函数的声明
{
printf("函数运行, %d, %lf\n", i, d);
}
void AnotherFunction(int i, double d) //另外一个函数声明
{
printf("又一个函数运行, %d, %lf\n", i, d);
}
int main()
{
void (*pFun)(int, double); //定义了一个函数指针
int (*p)(int , double); //用于调试的函数指针
pFun = function; //让这个函数指针指向第一个函数
pFun(10, 10.101); //通过这个函数指针来调用第一个函数
pFun = AnotherFunction; //让这个函数指针指向第二个函数
pFun(20, 20.202); //通过这个函数指针来调用第二个函数
//若将以下代码取消注释, 就会产生错误
/*
p = function;
p = AnotherFunction;
//原因很简单, 因为p是必须指向一个返回值为int, 第一个参数为int, 第二个参数为double的函数, 但是在此代码中定义的函数返回值是void
*/
//这个实验中, 直接用函数名来赋值了, 是因为函数名其实就是这个函数的指针
//而在平常调用函数时, 都要加上(), 如:printf("");
//这里, "()"就相当于'*'(就是取值运算符), printf是函数指针, 就相当于是数组名, 即数组的首地址
return 0;
}
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法为:
返回值类型 ( * 指针变量名) ([形参列表]);
如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
或者使用下面的方法将函数地址赋给函数指针:
f = func;
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
下面的程序说明了函数指针调用函数的方法:
#includestdio.h
int max(int x,int y){return (xy? x:y);}
int main()
{
int (*ptr)(int, int);
int a, b, c;
ptr = max;
scanf("%d%d", a, b);
c = (*ptr)(a,b);
printf("a=%d, b=%d, max=%d", a, b, c);
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流