当前位置: 首页 > news >正文

玳瑁的嵌入式日记D14-0807(C语言)

二级指针

定义个数组 


char* str[10]; //表示定义了一个包含 10个 char*类型 数组

char* str[10] = { "hello","world","china"};

此时数组的元素类型 --- 指针类型                 --- 指针类型的数组 
--- 指针数组                  --- 目的处理多个指针

此时 这是一个 指针类型的数组 --- 首元素的地址 str[0]     //元素类型 char *
&str[0]      //地址类型 char* *


二级指针 


char * *p;             //如果要保存的是 一个 一级指针变量所在空间的的地址 

&p    //p所在空间的数据类型 char**
//char***                                     


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

小结:
想要保存一个【普通变量】的地址 定义一个一级指针 
想要保存一个【一级指针变量】的地址 定义二级指针 
想要保存一个【二级指针变量】的地址 定义三级指针
... ...


练习: 
找出最大值 


--------------------------------------------------------------------
练习:
逆序 


练习:
排序  
比的是字符串 
换的是数组中的地址值


练习:
查找 


--------------------------------------------------------------------
char s[3][10] = {"hello","world","china"};
char (*p)[10] = s; //p称为 数组指针

                                    --- 指向目标 ---数组类型 


char *s[10] = {"hello","world","china"};

                       //指针数组 
char **p = s; //二级指针 

数组(的)指针 --- 本质 --- 指针  --- 基类型 是数组类型 
指针(的)数组 --- 本质 --- 数组  --- 元素类型 是 指针 
---------------------------------------------------------------------

指针 和 函数 


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

char * strcpy
char * strcat 


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

2.局部变量想要返回值地址 
 static 

堆区空间:
特点:   1. 大 
2. 手动申请,手动释放 

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


void free(void *ptr);
功能:
释放堆区的空间 
参数:
@pstr 之前用malloc申请到的堆区空间的地址 

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

    *p   //解引用 

p   //放的是一个地址 --- 引用 
*p  //解引用 


注意:
内存泄露 
申请了空间,但是用完后,没有释放
free 不能多次释放 
练习:
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 (int a,int b) * p = add;  //定义了一个指向 函数 的 指针 
-----函数类型--------- 

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


add(a,b);

p(a,b)

注意:
  函数指针 *运算不起作用 
一般不用写 * 


直接用指针变量 进行函数调用
p(a,b); 


函数回调


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 *str的值不能通过*p更改,

  1. 值传递的局限性getmemory函数接收的是char*类型的参数,这是值传递。在函数内部修改p的值(分配内存)不会影响外部的str指针,因为函数只得到了str的副本。

  2. 野指针操作str始终保持NULL,调用strcpy(str, "hello")会尝试向NULL地址写入数据,导致程序崩溃。

  • 方案 1:通过函数返回值将malloc分配的地址返回给外部指针(更直观)。
  • 方案 2:使用二级指针char**p,通过解引用修改外部指针的值(*p = ...)。

http://www.dtcms.com/a/319887.html

相关文章:

  • 蓝凌EKP产品:列表查询性能优化全角度
  • C++引用专题(上):详解C++传值返回和传引用返回
  • JavaScript核心概念解析:从基础语法到对象应用
  • 部署 AddressSanitizer(ASan)定位内存泄漏、内存越界
  • Java+Vue合力开发固定资产条码管理系统,移动端+后台管理,集成资产录入、条码打印、实时盘点等功能,助力高效管理,附全量源码
  • 【保姆级喂饭教程】python基于mysql-connector-python的数据库操作通用封装类(连接池版)
  • SPI TFT全彩屏幕驱动开发及调试
  • Sentinel原理之责任链详解
  • imx6ull-驱动开发篇12——GPIO子系统驱动LED
  • C++高频知识点(十五)
  • Qwen-Image开源模型实战
  • 【Floyd】Shortest Routes II
  • 显卡服务器的作用主要是什么?-哈尔滨云前沿
  • 使用内网穿透工具1分钟上线本地网站至公网可访问,局域网电脑变为服务器
  • Mysql数据仓库备份脚本
  • 2.7 (拓展)非父子通信(事件总线和provide-inject)详解
  • 2025 年华数杯全国大学生数学建模竞赛B题 网络切片无线资源管理方案设计--完整成品、思路、代码、模型结果分享,仅供学习~
  • java 生成pdf导出
  • 【tip】font-family的设置可能导致的文字奇怪展示
  • 《P3275 [SCOI2011] 糖果》
  • 运营商面向政企客户推出的DICT项目
  • 【ee类保研面试】数学类---概率论
  • 5G专网提高产业生产力
  • 别墅泳池设计综述:从理念创新到技术实现的系统性研究
  • 基于 PyTorch 从零实现 Transformer 模型:从核心组件到训练推理全流程
  • Java 大视界 -- Java 大数据在智能安防门禁系统中的人员行为分析与异常事件预警(385)
  • nvm安装,nvm管理node版本
  • Java设计模式总结
  • 【设计模式精解】什么是代理模式?彻底理解静态代理和动态代理
  • Vue自定义流程图式菜单解决方案