lv14 函数指针复习 2

发布时间:2024年01月05日

1 函数指针复习

内存的作用-----用来存放程序运行过程中的

  1. 数据

  2. 指令

1.1、 内存四区

  • 堆区:堆区是由程序员自己分配和管理的内存区域。程序员可以通过调用malloc、calloc等函数从堆区中分配一块内存,然后通过指针进行访问。堆区中存储着动态分配的变量和数据结构等。

  • 栈区:栈区是由编译器自动分配和管理的内存区域。每当函数被调用时,该函数的参数、局部变量和返回地址等信息都会被压入栈中。函数执行完毕后,这些信息就会从栈中弹出。栈区是一个先进后出的数据结构,它的大小通常是固定的。

  • 数据区:数据区是存储全局变量和静态变量等静态分配的内存区域。它在程序启动时就已经被分配好了,直到程序结束时才会被释放。数据区分为BSS段和DATA段两个部分,BSS段存储未初始化的全局变量和静态变量,而DATA段存储已初始化的全局变量和静态变量。

  • 代码区:代码区也称为文本区,是存储程序代码的内存区域。在程序执行时,代码区中的指令依次被加载到CPU中执行。代码区通常是只读的,防止程序意外修改其中的指令。

1.2、C语言中内存数据的访问方式

直接访问:通过所在空间名称去访问

int num = 10;  // 定义一个整型变量num并赋值为10
int arr[3] = {1, 2, 3};  // 定义一个整型数组arr并初始化
printf("%d\n", num);  // 直接输出变量num的值
printf("%d\n", arr[1]);  // 直接输出数组arr中下标为1的元素的值

间接访问:通过所在空间首地址去访问 *地址值 此时的*为间接访问运算符

int num = 10;  // 定义一个整型变量num并赋值为10
int *p = #  // 定义一个指向整型变量num的指针p
*p = 20;  // 通过指针p间接修改变量num的值为20
printf("%d\n", *p);  // 通过指针p间接输出变量num的值

1.3、C语言中函数调用方式:

直接调用:通过函数名去调用函数

间接调用:通过函数在代码区所对应的那份空间的首地址去调用

int func(int a,int b)
{
 ? ?//......
}
?
int (int a,int b) ?* pf;//语法错误
int *pf(int a,int b);//函数声明语句
int (*pf)(int a,int b);//定义一个函数指针
pf = &func;//&运算符后面如果是函数名的话可以省略不写
pf = func;
?
y = func(3,4);//直接调用
y = (*pf)(3,4);//间接调用,*运算符后面如果是函数指针类型则可以省略不写
y = pf(3,4);//间接调用
?
typedef int myint;
typedef int (*)(int,int) ?pft;//语法错误
typedef int (*pft)(int,int) ;
pft pt;
 

1.4 适用场合

前提:当有很多个同类函数待被调用时

A处:知道所有函数名,由此处来决定B处将会调用哪个函数

B处:负责调用A处指定的函数

思考:A处如何告诉B处被调用的是哪个函数呢,无非两个办法:

  1. 告诉B处函数名,怎么做呢?传字符串----“函数名”? C语言没有对应语法支持

  2. 告诉B处对应函数在代码区的地址

2 练习

写一个回调函数,模仿sqort

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef int(*CompareFunc)(const void*,const void*);

int compareInt(const void * a, const void * b)
{
	const int * ia = (const int *)a;
	const int * ib = (const int *)b;
	return (*ia -*ib);
}

void bubbleSort(void* base, size_t num, size_t size,CompareFunc compare)
{
	size_t i ;
	size_t j ;
	char* arr = (char*)base;
    for (i = 0; i < num-1; i++) 
	{
        for (j = 0; j < num-i-1; j++) 
		{
            // 使用函数指针调用比较函数
            if (compare(arr + j*size, arr + (j+1)*size) > 0) 
			{
                // 交换两个元素
                char* temp = (char*)malloc(size);
                memcpy(temp, arr + j*size, size);
                memcpy(arr + j*size, arr + (j+1)*size, size);
                memcpy(arr + (j+1)*size, temp, size);
                free(temp);
            }
        }
    }                                                                                                         
}

int main(int arg,char * argv[])
{
 	int arr[] = {5, 2, 8, 1, 9};
    size_t i;
	size_t num = sizeof(arr) / sizeof(arr[0]);
    
    bubbleSort(arr, num, sizeof(int), compareInt);
    
    for (i = 0; i < num; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

文章来源:https://blog.csdn.net/m0_60718520/article/details/135322877
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。