C语言或驱动程序函数调用前有下划线,调用的时候就没有下划线,问下为啥,还有前面多了个P

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言或驱动程序函数调用前有下划线,调用的时候就没有下划线,问下为啥,还有前面多了个P相关的知识,希望对你有一定的参考价值。

typedef struct _MYDATASTRUCT

ULONG number;
LIST_ENTRY ListEntry;
MYDATASTRUCT, *PMYDATASTRUCT;

#pragma INITCODE
VOID Test_List()
//VOID LinkListTest()

//定义列表名称
LIST_ENTRY hesnList;

//初始化列表
InitializeListHead(&hesnList);

//定义结构体
PMYDATASTRUCT pHesn_Struct;

这个代码中 typedef struct _MYDATASTRUCT 中 _MYDATASTRUCT 使用了下划线
调用的时候 PMYDATASTRUCT pHesn_Struct; 却没有瞎花钱,前面加了个P,是什么意思

有下划线的是结构名称,没有的是别名,二者是等校的。
看第一个关键字typedef,他把结构_MYDATASTRUCT 定义为MYDATASTRUCT和 *PMYDATASTRUCT两个别名,一个是非指针类型、一个是指针类型,P其实是程序员自己加的一个标示符,说明他是一个指针变量。
参考技术A typedef struct _MYDATASTRUCT 

ULONG number;
LIST_ENTRY ListEntry;
 MYDATASTRUCT, *PMYDATASTRUCT;

简化与问题无关的代码,就是

typedef struct _MYDATASTRUCT ... MYDATASTRUCT, *PMYDATASTRUCT;

和一般变量的声明一样,这可以看作等同于两句代码

typedef struct _MYDATASTRUCT ... MYDATASTRUCT;
typedef struct _MYDATASTRUCT *PMYDATASTRUCT;

能看出来MYDATASTRUCT就是这个结构体的别名,PMYDATASTRUCT就是指向这个结构体的指针的别名

函数嵌套和递归调用

C语言函数调用形式有两种:嵌套调用、递归调用。
C语言函数嵌套调用:
在调用一个函数的过程中,又调用另一个函数,称为函数嵌
套调用,C语言允许函数多层嵌套调用,只要在函数调用前
有函数声明即可。

 1 #include <stdio.h>
 2 int fa(int a,int b); //fa函数原型
 3 int fb(int x); //fb函数原型
 4 int main(){
 5     int a=5,b=10,c;
 6     c=fa(a,b);
 7     printf("%d
",c);
 8     c=fb(a+b);
 9     printf("%d
",c);
10     return 0;
11 } 
12 
13 int fa(int a,int b){
14     int z;
15     z=fb(a*b);
16     return z;
17 }
18 
19 int fb(int x){
20     int a=15,b=20,c;
21     c=a+b+x;
22     return c;
23 }

技术图片

  技术图片

C语言函数递归调用:

函数直接或间接调用自己称为递归调用。C语言允许函数递
归调用,如图(a) 所示为直接递归调用,如图(b)所示为间接递归调用。

技术图片

注意事项: 

1.在函数递归调用时,递归函数每次调用其本身,
一个新的函数栈就会被使用,这个新函数栈里的形参、
变量和该函数的另-个函数栈里面的形参、变量是完全不同
的内存单元。

2.递归函数必须定义一个终止条件,否则函数会永远递归下去,
直到栈空间耗尽。所以,递归函数内一般都用类似f语句来判定终止条件,
如果条件成立则继续递归调用,否则函数结束递归开始返回。

技术图片

递归基本思想:

找出递归子结构性质(原问题的解包含了子问题的解)、用
子问题的解来递归定义原问题的解、找出递归终止条件。
递归算法设计的关键在于:找出递归关系式和递归终止条件。
递归关系就是使问题向边界条件转化的过程,所以递归关系
必须能使问题越来越简单,规模越来越小。
因此递归算法设计,通常有以下三个步骤:
1.分析问题,得出递归关系式。
2.设置边界条件,控制递归。
3.设计函数,确定参数。

技术图片

 技术图片

 1 #include<stdio.h>
 2 int Hanio(int n,char A,char B,char C){
 3     //只有一个盘子直接A->C
 4     if(n==1) printf("%c->%c",A,C);
 5     else{
 6         //上面n-1块盘子A->B
 7         Hanio(n-1,A,C,B);
 8         //第n块盘子直接A->C
 9         printf("%c->%c",A,C);
10         //B塔n-1块盘子B->C
11         Hanio(n-1,B,C,A);
12     }
13 }
14 
15 int main(){
16     int n;
17     printf("input n:");
18     scanf("%d",&n);
19     Hanio(n,A,B,C);
20     return 0;
21 }

以上是关于C语言或驱动程序函数调用前有下划线,调用的时候就没有下划线,问下为啥,还有前面多了个P的主要内容,如果未能解决你的问题,请参考以下文章

go语言语法(基础语法篇)

跪求C语言函数调用的详细过程,函数之间是怎么传递的,到底是怎么发生调用的,最好是视频

函数嵌套和递归调用

c语言编程中出现的纠错英文语句是什么意思?

C函数后面多加两条下划线是干啥的?

C语言的回调函数