内存的作用-----用来存放程序运行过程中的
数据
指令
堆区:堆区是由程序员自己分配和管理的内存区域。程序员可以通过调用malloc、calloc等函数从堆区中分配一块内存,然后通过指针进行访问。堆区中存储着动态分配的变量和数据结构等。
栈区:栈区是由编译器自动分配和管理的内存区域。每当函数被调用时,该函数的参数、局部变量和返回地址等信息都会被压入栈中。函数执行完毕后,这些信息就会从栈中弹出。栈区是一个先进后出的数据结构,它的大小通常是固定的。
数据区:数据区是存储全局变量和静态变量等静态分配的内存区域。它在程序启动时就已经被分配好了,直到程序结束时才会被释放。数据区分为BSS段和DATA段两个部分,BSS段存储未初始化的全局变量和静态变量,而DATA段存储已初始化的全局变量和静态变量。
代码区:代码区也称为文本区,是存储程序代码的内存区域。在程序执行时,代码区中的指令依次被加载到CPU中执行。代码区通常是只读的,防止程序意外修改其中的指令。
直接访问:通过所在空间名称去访问
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的值
直接调用:通过函数名去调用函数
间接调用:通过函数在代码区所对应的那份空间的首地址去调用
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;
前提:当有很多个同类函数待被调用时
A处:知道所有函数名,由此处来决定B处将会调用哪个函数
B处:负责调用A处指定的函数
思考:A处如何告诉B处被调用的是哪个函数呢,无非两个办法:
告诉B处函数名,怎么做呢?传字符串----“函数名”? C语言没有对应语法支持
告诉B处对应函数在代码区的地址
写一个回调函数,模仿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;
}