指针函数用法 函数指针数组定义
大家好,指针函数用法相信很多的网友都不是很明白,包括函数指针数组定义也是一样,不过没有关系,接下来就来为大家分享关于指针函数用法和函数指针数组定义的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
指针函数和指向函数的指针在意义和用法上有什么区别
函数指针和指针函数的区别:
一、【函数指针】
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。
1、函数指针定义
函数类型(*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int(*f)(int x);
double(*ptr)(double x);在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;函数指针的类型和函数的返回值类型也必须是一致的。
2、函数指针的赋值
函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。例如,
int func(int x);/*声明一个函数*/
int(*f)(int x);/*声明一个函数指针*/
f=func;/*将func函数的首地址赋给指针f*/
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
3、通过函数指针调用函数
函数指针是通过函数名及有关参数进行调用的。
与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。
由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:首先,要说明函数指针变量。
例如:int(*f)(int x);
其次,要对函数指针变量赋值。
例如: f=func;(func(x)必须先要有定义)
最后,要用(*指针变量)(参数表);调用函数。
例如:(*f)(x);(x必须先赋值)
【例】任意输入n个数,找出其中最大数,并且输出最大数值。
main()
{
int f();
int i,a,b;
int(*p)();/*定义函数指针*/
scanf("%d",&a);
p=f;/*给函数指针p赋值,使它指向函数f*/
for(i=1;i<9;i++)
{
scanf("%d",&b);
a=(*p)(a,b);/*通过指针p调用函数f*/
}
printf("The Max Number is:%d",a)
}
f(int x,int y)
{
int z;
z=(x>y)?x:y;
return(z);
}
运行结果为:
343-45 4389 4235 1-534 988 555 789↙ The Max Number is:4389
二、【指针函数】
一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。
返回指针的函数,一般定义格式为:
类型标识符*函数名(参数表)
int*f(x,y);
其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。
如:char*ch();表示的就是一个返回字符型指针的函数,请看下面的例题:
【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.
#include"stdio.h"
main()
{
char*ch(char*,char*);
char str1[]="I am glad to meet you!";
char str2[]="Welcom to study C!";
printf("%s",ch(str1,str2));
}
char*ch(char*str1,char*str2)
{
int i;
char*p;
p=str2
if(*str2==NULL) exit(-1);
do
{
*str2=*str1;
str1++;
str2++;
}
while(*str1!=NULL);
return(p);
}
通过分析可得:
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,函数指针可以用来指向一个函数。
具体介绍下指针用法
指针的用法很复杂,可以写一本书,下面我列一下,指针的三个基本概念
/*
第一段函数,说明指针就是地址,指针变量就是存放某个变量地址的变量。
*/
# include<stdio.h>
int main(void)
{
int*p;
int a= 5;
p=&a;
/*指针变量p存放了变量a的地址,也即指针p指向了变量a
但修改p的值不会影响a的值,同理修改a的值也不会影响
p的值,因此 p= a,错误类型不一致, p= 44,错误赋值
类型不一致*/
return 0;
}
/*
第二段函数,说明如果一个指针变量p指向了某个普通变量,*p就完全等同于这个变量
改变了*p的值就改变了他所指向的变量的值。
*/
# include<stdio.h>
int main(void)
{
int*p;
int a= 5;
p=&a;
*p= 6;
printf("%d\n", a);//此函数输出的a值为6,改变了原来的5;
return 0;
}
/*
第三段函数,说明指针是除函数返回值以外可以通过被调函数改变主调函数的变量的值的。
*/
# include<stdio.h>
void fun(int*p)
{
int c= 6;
*p= c;
}
int main(void)
{
int a= 5;
fun(&a);
printf("%d\n", a);//此处输出的a值为6
}
C++智能指针的几种用法
一、auto_ptr模板
auto_ptr与shared_ptr、unique_ptr都定义了类似指针的对象,可以将new到的地址赋给这一对象,当智能指针过期时,析构函数会调用delete函数,对象将被销毁,由此内存可以自动被释放。
二、shared_ptr模板
先看代码:
auto_ptr p1(new string("hello world!");
auto_ptr p2;
p2= p1;
在以上代码中,p1与p2指向同一对象,常规指针在释放内存时,系统会尝试删除同一对象两次。在auto_ptr中,对象的所有权会归于p2,p1将会变为野指针。shared_ptr则允许多个指针指向同一个对象,每多一个指针指向,计数器就会+1,同样在释放的时候,当数值减为0的时候即最后一个指针过期的时候才会调用delete函数。
三、unique_ptr模板
同样为了避免多个指针指向,unique_ptr严格了所有权的概念,即我的就我的,不允许他人指向(如代码段二中,采用unique_ptr编辑将会报错,而原代码会编译通过但可能造成崩溃)。
四、总结
需要多个指针指向一个对象时可使用shared_ptr,如指针数组。不需要多个指针指向一个对象可使用uniq_ptr,uniqu_ptr比auto_ptr更加安全(编译报错远比程序崩溃好得多)。
关于指针函数用法到此分享完毕,希望能帮助到您。