目录

一、堆

void * 万能指针:可以接受任意类型的地址 

二、函数指针(返回值为指针类型的函数)

快速排序:


一、堆

malloc //堆上 
            //堆空间的特点
1. 大
2. 手动申请,手动释放

3. 申请 和 释放必须成对出现 (如果申请,但没释放 ---- 内存泄露)

#include <stdlib.h>
//申请空间 
void *malloc(size_t size);  //malloc(sizeof(int)*10)
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size); 

void free(void *ptr); //释放空间

void *malloc(size_t size); 
功能:
   申请堆区空间 
参数:
  @size  表示申请的空间大小 
         单位 字节 
返回值:
  void *   表示 空类型 指针 
  成功 返回申请到的空间的首地址 
  失败 NULL 

void *calloc(size_t nmemb, size_t size);

例如,如果要分配一个包含10个整数的数组,可以这样写:
                                        int arr = (int) calloc(10, sizeof(int));
        这样就分配了10个整数大小的内存,并且每个整数都被初始化为0。

在C语言中,calloc()函数用于动态分配内存,并且会将分配的内存初始化为0。它的函数原型如下:

void *calloc(size_t num, size_t size);

         //calloc()接受两个参数:

         //num:表示要分配的元素个数。

         //size:表示每个元素的大小(以字节为单位)。

void *realloc(void *ptr, size_t size); 
        //realloc(之前申请到的一块空间的地址,重新申请的空间的大小);
         //realloc(NULL,sizeof(int));<==> malloc
         //realloc(p,0); <==> free  //释放空间 

注意:
 1.不要多次free同一块堆空间 
 2.只能释放堆区上的空间 
 3.free(p);   //p = NULL; //防止野指针 也防止后续误操作 

void * 万能指针:可以接受任意类型的地址 

注意:

int a = 10;
void *p = &a;

printf("%d\n",*p); //void 表示空类型 则 最终不知道 偏移多大一块空间 

如果想通过 void* 类型的指针 引用到数据 
必须,强转为 ,你希望 访问的 指针类型 
 printf("%d\n",*(int*)p);

注意:
  1.指针类型 可以作为函数的返回值类型 
  2.不能返回一个 局部变量(栈上)的地址 ---已经是一个被销毁了的空间 

二、函数指针(返回值为指针类型的函数)

可以获得函数所在空间的地址 ---- 函数名 就是函数的入口地址 
int add(int a,int b)
{
    
}    //add函数名 ---就是函数的入口地址 

定义个什么类型的指针 来存放这种地址 

函数 也是有类型 --- 函数类型 
int add(int a,int b); //add名字去掉 剩下就是函数类型 
    //int (int a,int b) //---表示这么一类函数 ,返回值为int型,同时带有两个int型 形参 
地址写法:

int (int a,int b)  * p; //这种函数类型的指针  ---理解可以,但是不能这么写 

int (*p) (int a,int b) ; //C语言标准写法 

回调函数 
  //通过函数指针 进行 函数调用 这种就叫回调函数 
  //C语言是通过函数指针 实现回调 

例如:void processData(int a,int b, int (*pfunc)(int,int))     //pfunc就是回调函数

快速排序:

#include <stdlib.h>

void qsort(void *base,    //指向要排序的数组起始地址 
         size_t nmemb,    //要排序的元素个数 
		 size_t size,     //单个元素大小 
		 int (*compar)(const void *, const void *)  //比较规则一个 函数 --- 函数指针 
		 );


int compar(const void *a, const void *b) //a 和 b 实际上是数组中某两个元素的地址 
{
    
    return *(int *)a - *(int *)b;
		
}

main函数的参数:
int main(int argc, const char *argv[])
@argc  --- 表示命令行参数的个数 
@argv  --- 命令行参数(都是字符串)
           所在的数组 

例子:

用途就是在运行的时候输入参数给程序

#include <stdio.h>
                        //等价于char **argv
int main(int argc ,const char *argv[])             
{
    printf("argc = %d\n",argc);

    int i =0;

    while (argv[i] != NULL)
    {
        printf("argv[%d] = %s\n",i,argv[i]);
        ++i;
    }
    return 0;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐