C语言各子函数程序分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言各子函数程序分析相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
char num[6];
char name[10];
char unit[20];
char phone[13];
char addr[30];
datatype;
typedef struct node
datatype data;
struct node * next;
listnode;
typedef listnode * linklist;
linklist head;
listnode *p;
int menu_select( );
linklist createlist(void);
void insertnode(linklist head,listnode *p);
listnode *listfind(linklist head);
void delnode(linklist head);
void printlist(linklist head);
void main()

for( ; ; )
switch(menu_select() )

case 1:
printf(" ***********************************************\n");
printf(" ************** 联系人链表的建立 ***************\n");
printf(" ***********************************************\n");
head=createlist();
break;
case 2:
printf(" ***********************************************\n");
printf(" ************** 联系人信息添加 *****************\n");
printf(" ***********************************************\n");
printf(" ** 编号(4) 姓名(8) 单位(20) 电话(11) 地址(30)**\n");
printf(" ***********************************************\n");
p=(listnode *)malloc(sizeof(listnode));
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.unit,p->data.phone,p->data.addr);
insertnode(head,p);
break;
case 3:
printf(" ******************************\n");
printf(" ******* 联系人信息查询 *******\n");
printf(" ******************************\n");
p=listfind(head);
if(p!=NULL)
printf(" ** 编号 姓名 单位 电话 地址**\n");
printf(" ------------------------------\n");
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.unit,p->data.phone,p->data.addr);
printf(" ------------------------------\n");

else
printf("没有你要找的人 ! \n");
break;
case 4:
printf(" ***********************************\n");
printf(" **********联系人信息的删除***********\n");
printf(" ***********************************\n");
delnode(head);
break;
case 5:
printf(" ***********************************\n");
printf(" **********联系人链表的输出*********\n");
printf(" ***********************************\n");
printlist(head);
break;
case 0:
printf("\t 欢迎您下次使用! \n");
return;




我在线等答案 麻烦各位高手写一下各段的意思 谢谢啊

int menu_select( );
linklist createlist(void);
void insertnode(linklist head,listnode *p);
listnode *listfind(linklist head);
void delnode(linklist head);
void printlist(linklist head);

这些函数,你知道是弄什么的吧,可是我不知道,你得弄齐全的代码,才可以完全看懂啊。
大致的感觉是,这是一个关于联系人列表的建立、查询、修改等功能!
前面一段是结构体的定义和一些主要函数的声明。之后的是一个main函数,main函数主要页就是用了一个switch选择语句,将各个功能分隔开。并且调用各个函数,实现功能!
参考技术A 你复制别人的代码就算了,自己还看不懂

C语言函数指针详解

1、概念

函数指针就是一个指针,指针指向某个内存区域,函数指针就是指向函数入口地址的这么一个指针变量,在.c文件中编写一个函数,将.c编译为可执行程序后,在.c文件中编写的函数会存放在可执行程序的代码段中,入口地址就在这,先贴代码,再慢慢分析:

#include <stdio.h>
             
int val = 1;

void Test(int a)

    printf("In Test a = %d\\n", a);   


void Test111(int a)

    printf("In Test111 a = %d\\n", a);   


void Formal(void(*p)(int))

    printf("In Formal Call:\\n"); 
    (*p)(10);


void Formal111(void(**pp)(int))

    printf("In Formal111 Change p\\n");
    (*pp) = Test111;
    (**pp)(10);


int main()

    int step;
    // 函数指针声明
    void(*p)(int);

    // 函数指针赋值
    p = Test;
    
    printf("Input 1 to Dsp Addr\\n");
    printf("Input 2 to Dsp Call\\n");
    printf("Input 3 to Dsp Formal parameter1\\n");
    printf("Input 4 to Dsp Formal parameter2\\n");
    
    while(1)
    
        scanf("%d", &step); 
        printf("****************************\\n");
        if(step == 1)       // 地址展示
        
            printf("Test = %p\\n", Test);
            printf("p    = %p\\n", p);
            printf("&val = %p\\n", &val);
        
        else if(step == 2)  // 调用展示
        
            (*p)(10);
        
        else if(step == 3)  // 形参展示1
        
            Formal(p);
        
        else if(step == 4)  // 形参展示2
        
            Formal111(&p);
        
        else
        
            printf("Input Num Must From 1 To 4\\n");
        
        printf("****************************\\n");
    

    return 0;

2. 代码分析

2.1 准备

保存上面的代码,命令为a.c,执行编译命令:gcc a.c -o test

2.2 入口地址分析

为了方便理解,我们定义了一个初始化的全局变量 val ,当定义指向该变量指针的时候就是指向其地址,初始化的全局变量存在于数据段,执行objdump -j .data -S test反编译程序数据段可以查看val的存放地址:

 同理,我们定义的函数指针指向Test函数的入口地址,该函数存放在代码段,执行命令objdump -j .text -S test 进行反编译查看:

 接下来将程序跑起来,输入数字1可以查看地址:

2.3 函数指针声明调用

了解了函数指针的本质后,来看下函数指针的声明,声明就是按样式来:

函数返回值类型(*指针变量名称)(函数参数列表)

示例中Test函数返回值为void参数入参为一个int类型数据,因此声明即为:void (*p)(int)

调用函数就是把(*p)这个当做函数名称Test来使用即可,输入数字2查看调用:

2.4 函数指针作为形参

函数指针作为形参时,就是把你声明的那一堆东西扔进形参列表里就行了, 像示例中void Formal(void(*p)(int))这样即可,输入数字3查看该函数执行:

2.5 函数指针的指针

多说一下函数指针的指针,和指针的指针一样,可以改变指针本身,输入数字4改变函数指针指向,再输入数字2可以查看指针指向已经改变了

 

以上是关于C语言各子函数程序分析的主要内容,如果未能解决你的问题,请参考以下文章

C语言 函数调用模型

C语言 函数调用模型

c语言函数的栈帧

c语言中函数调用的本质从汇编角度分析

c语言中,如何画带有函数嵌套的流程图?

扫雷(C语言版)