理解C语言——从小菜到大神的晋级之路(13)——进一步讨论函数与指针

简介: 本期视频:点击这里 1、main函数的参数         在我们编写的简单程序中,main函数常常是不带参数的。比如这样一个简单的程序,给main函数添加参数似乎也没什么意义: int main(){ printf("Hello world!\n");}        而实际上,main函数是可以添加参数的,而且在实际应用中也非常普遍。
本期视频:点击这里


1、main函数的参数



        在我们编写的简单程序中,main函数常常是不带参数的。比如这样一个简单的程序,给main函数添加参数似乎也没什么意义:
int main()
{
     printf("Hello world!\n");
}

        而实际上,main函数是可以添加参数的,而且在实际应用中也非常普遍。main函数完整的原型如下所示:
int main(int argc, char **argv);

        主函数的参数的传入,不是在我们所编写的C程序代码中实现的,而是在运行C程序时,通过命令行传入。在程序运行的过程中,命令行的数据将会从main函数参数中传入程序代码中。其中,argc表示命令行参数的个数,argv以字符串数组的形式表示每一个命令行参数。需要注意的是这两个参数都包含可执行程序程序本身。比如如果我们编译出来的可执行程序名称为hello.exe,那么在命令行或批处理文件中写入以下命令:
hello.exe name1 name2

        在这种情况下,argc为3,表示整个命令行有3个参数;argv表示保存每个命令行参数的数组, argv[0] 、argv[1]、 argv[2]分别表示"hello.exe"、"name1"和"name2"。

        main函数的参数在实际应用中比较常用。例如很多程序可能需要比较复杂的配置数据,这些配置数据通常写入一个配置文件中。在程序调用的时候,可以通过命令行参数传入配置文件的地址,在程序中通过命令行参数获取的地址来打开和解析配置文件。


2、指向函数的指针



        在前面的内容中,我们讨论的指针变量指的是一种保存了数据内存地址的数据类型。通过指针变量保存的地址,我们可以获取目标内存中保存的数据。指针变量通常在函数参数传递、连续内存数据遍历等场合可以发挥重大作用。在定义时,需要根据所指向的内存中保存的数据类型来定义指针变量的类型。如我们需要一个执行int型数据的指针变量pInt,那么就应定义int *pInt。

        事实上,指针变量不仅仅可以指向各种数据,还可以指向某个函数。在我们定义一个函数的时候,实际上函数名就代表了这个函数的入口地址,因此可以定义一种指向该类型函数的指针变量带指向函数的地址。
假设我们定义以下函数:
int GoodMorning(char *pName)
{
   if(NULL == pName)
   {
     printf("Please enter the name.\n");
     return 0;
   }
   else
   {
     printf("Good morning, %s.\n", pName);
   }
   return 1;
}

        众所周知,函数的调用格式为:函数名(实参列表)。在编译时,函数名实际上会被编译器转换为一个函数指针指向实际的地址。在程序中,函数名本身赋予指向函数的指针时就可以认为是函数的地址所在。我们定义一个指向函数的指针,并指向上述函数:
int (* greetings)( char * pName ) = GoodMorning ;
//等价于int (* greetings)( char * pName ) = &GoodMorning ;

        然后,我们可以通过函数指针调用该函数, 其功能和 GoodMorning ( "Jerry" )相同。
greetings ( "Jerry" );

        需要注意的是,函数指针的类型必须与目标函数完全一致,包括返回值类型和参数个数、类型。如果出现不一致将无法指向。


3、函数指针作为参数传递



        函数名以及指向函数的指针可以作为参数传递到另一个函数内。事实上,作为参数的函数指针与其他类型的变量指针并没有本质的区别,都是某一段内存的地址。在前面的内容中,由于指针类型是某种变量类型(比如int *),这段内存中的数据都将按照这种变量来处理;如果这个指针是某个函数类型,那么这段内存中的数据就被当做函数的代码,可以对其进行调用。

        我们把上述程序稍作修改:
void greetings(int (* grt_func)( char * pName ), char * pName )
{
      grt_func(pName);
}

        像这类传入一个函数指针到其他函数,并在这个函数内部通过函数指针调用的方式称为回调函数。在多种实际开发的场合,回调函数都会起巨大作用。
目录
相关文章
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
25 3
|
1天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
17 10
|
5天前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
5天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
4天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
5天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
5天前
|
C语言
C语言指针(3)
C语言指针(3)
9 1
|
5天前
|
C语言
C语言指针(2)
C语言指针(2)
9 1
|
11天前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
11天前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)