C语⾔函数指针和指针函数及Main()函数
正⽂
先来看看两者的定义以及说明。
指针变量的定义格式指针函数
定义
指针函数,简单的来说,就是⼀个返回指针的函数,其本质是⼀个函数,⽽该函数的返回值是⼀个指针。
声明格式为:类型标识符 *函数名(参数表)
这似乎并不难理解,再进⼀步描述⼀下。
看看下⾯这个函数声明:
int fun(int x,int y);
这种函数应该都很熟悉,其实就是⼀个函数,然后返回值是⼀个 int 类型,是⼀个数值。
接着看下⾯这个函数声明:
int *fun(int x,int y);
这和上⾯那个函数唯⼀的区别就是在函数名前⾯多了⼀个*号,⽽这个函数就是⼀个指针函数。其返回值是⼀个 int 类型的指针,是⼀个地址。
这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对⽐不过就是其返回了⼀个指针(即地址值)⽽已。
指针函数的写法:
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);
这个写法看个⼈习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。
⽰例
(由于本⼈习惯于 Qt 中进⾏开发,所以这⾥为了⽅便,⽰例是在 Qt ⼯程中写的,其语法是⼀样的,只是输出⽅式不同)
来看⼀个⾮常简单的⽰例:
typedef struct _Data{
int a;
int b;
}Data;
//指针函数
Data* f(int a,int b){
Data * data = new Data;
data->a = a;
data->b = b;
return data;
}
函数指针
定义
函数指针,其本质是⼀个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)
如下:
int (*fun)(int x,int y);
函数指针是需要把⼀个函数的地址赋值给它,有两种写法:
fun = &Function;
fun = Function;
取地址运算符&不是必需的,因为⼀个函数标识符就表⽰了它的地址,如果是函数调⽤,还必须包含⼀个圆括号括起来的参数表。
调⽤函数指针的⽅式也有两种:
x = (*fun)();
x = fun();
两种⽅式均可,其中第⼆种看上去和普通的函数调⽤没啥区别,如果可以的话,建议使⽤第⼀种,因为可以清楚的指明这是通过指针的⽅式来调⽤函数。当然,也要看个⼈习惯,如果理解其定义,随便怎么⽤都⾏啦。
⽰例
int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
//函数指针
int (*fun)(int x,int y);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//第⼀种写法
fun = add;
qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
/
/第⼆种写法
fun = ⊂
qDebug() << "(*fun)(5,2) = " << (*fun)(5,3) << fun(5,3);
();
}
输出如下:
(*fun)(1,2) = 3
(*fun)(5,2) = 2 2
上⾯说到的⼏种赋值和调⽤⽅式我都分别使⽤了,其输出结果是⼀样的。
⼆者区别
通过以上的介绍,应该都能清楚的理解其⼆者的定义。那么简单的总结下⼆者的区别:
定义不同
指针函数本质是⼀个函数,其返回值为指针。
函数指针本质是⼀个指针,其指向⼀个函数。
写法不同
指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);
可以简单粗暴的理解为,指针函数的*是属于数据类型的,⽽函数指针的星号是属于函数名的。
再简单⼀点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。
Main()函数俩个参数
1、定义
C语⾔规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数
头可写为: main (argc,argv)C语⾔还规定argc(第⼀个形参)必须是整型变量,argv( 第⼆个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:
int main (int argc,char *argv[]){…}或者
int main (int argc,char **argv){…}
其中第⼀个表⽰参数的个数;第⼆个参数中argv[0]为⾃⾝运⾏⽬录路径和程序名,argv[1]指向第⼀个参数、argv[2]指向第⼆个参数…… 完整程序如下
2、如何执⾏
由于main函数不能被其它函数调⽤, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操作系统命令⾏上获得的。当我们要运⾏⼀个可执⾏⽂件时,在DOS提⽰符下键⼊⽂件名,再输⼊实际参数即可把这些实参传 送到main的形参中去,具体操作如下:
⾸先在C++中完成编译之后,然后在dos命令窗⼝下切换到.exe执⾏⽂件所在的⽂件夹(dos下如何切换⽬录见DOS中切换盘符及⽬录),再在该路径下输⼊带参数的命令: a b c …即可得到输出。
3、练习题
不合法的main函数命令⾏参数表⽰形式是
(A) main(int a,char *c[]) (B) main(int arc,char **arv)
(C) main(int argc,char *argv) (D) main(int argv,char *argc[])
**分析:**main的第2个参数应该为⼀个字符数组指针,B的第⼆个参数是⼀个指向字符的指针的指针,也就是⼀个字符串数组;
C的第⼆个参数是⼀个指向字符的指针,也就是⼀个字符串.
char **argv或者char *argv[]是个⼆维数组,也可以理解为⼀个存放字符指针的数组—字符指针数组。每个元素存放⼀个字符指针,⽽字符指针⼜是可以指向⼀个字符串的,这n个字符串分别由argv[0]~~~argv[n]来指向.
这个就是指针数组,不是别的,特别不是⼆维数组。
综述,答案为C。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论