一.二级指针

如果要保存的是一个一级指针变量所在空间的的地址那就可以写为:char * *p;

int  a = 10; //整型变量 对应要开要给4字节空间  有空间 就有地址 
int * p = &a; //p也是变量(一级指针变量) 是变量 就有空间 有空间 就有地址
int* * q = &p; //q也是变量(二级指针变量) 是变量 就有空间 有空间 就有地址
int** *r = &q; //三级指针 

  r   //r中放的是 q的地址 
 *r   //就相当于是q  q中放的就是 p的地址 
**r   //*q 相当于p  p中放的是 a 的地址
***r  //*p 相当于a  就是a中的值 10

二.堆区空间

 特点: 大 
        手动申请,手动释放 

   函数 
       void *malloc(size_t size);
       功能: 
           堆区申请空间 
       参数:
          @size 表示申请的大小 
       返回值:
          成功 返回申请到的堆区空间的地址 
          失败  NULL
       void free(void *ptr);
       功能:
          释放堆区的空间 
       参数:
          @pstr 之前用malloc申请到的堆区空间的地址 
      

      
      NULL    //空指针 
      void *  //空类型指针
              //万能指针 
              //  表示可以接收任意类型的指针 
              注意:
                 如果通过 void *类型的地址 进行解引用操作 
                 会报错,
                 如果要用,必须转换为 具体的类型
              //int*      

    *p   //解引用 

eg:
   int a[10];
   要求,定义一个数组,放在堆上 
   输入10个值,输出 

三.函数指针

int add(int a,int b)
{
    return a + b;
}
add //函数名  --- 代表的是函数的入口地址 
    //函数名是标识符 
    //函数也是一种类型 
    //去掉标识符 --- 剩下就是标识符对应的数据类型 
    //int (int a,int b) --- 函数类型 --- 表示是一类函数 ,返回值为int型 ,带有两个int型形参这么一类函数

void *p = add;

int (*p) (int,int)  = add;  //定义了一个指向 函数 的 指针 

函数回调
    
   
main函数的参数:
  
  const char *s[]  = {"hello","world","china"};
   
  
  const char * argv[] //数组 --指针数组 ---const char * 
  const char ** arg   //编译器最终理解的形式 
   
   
  int main(int argc,const char *argv[])
  
  argc  命令行参数的个数 
  argv  表示命令参数对应字符串的 一个指针数组 

四.指针函数

//指针(的)函数  --- 本质 ---函数---只是 返回值是指针类型而已 
  表示 返回值类型 为指针类型的函数 
  
char * strcpy
char * strcat 


 注意:
   1.函数可以返回地址 
    但是,不能是局部变量(auto--栈上)的地址,auto的局部变量的生命周期 随着函数调用开始存在,函数调用结束销毁
   
   2.局部变量想要返回值地址 
     static 

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐