当前位置: 首页 > 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.lryc.cn/news/613298.html

相关文章:

  • NVIDIA/k8s-device-plugin仓库中GPU无法识别问题的issues分析报告
  • Linux学习记录 DNS
  • LocalSqueeze(图片压缩工具) v1.0.4 压缩
  • nlp-句法分析
  • ClickHouse数据迁移
  • Redis持久化存储
  • 【网络运维】Linux:NFS服务器原理及配置
  • ansible-playbook之获取服务器IP存储到本地文件
  • Linux---第三天---权限
  • Idea打包可执行jar,MANIFEST.MF文件没有Main-Class属性:找不到或无法加载主类
  • 3a服务器的基本功能1之身份认证
  • LINUX-文件查看技巧,重定向以及内容追加,man及echo的使用
  • Java开发时出现的问题---架构与工程实践缺陷
  • vue开发的计算机课程页面
  • Salesforce 的Event Monitoring和Audit Trail 区别
  • C语言中级_动态内存分配、指针和常量、各种指针类型、指针和数组、函数指针
  • 洛谷P1990 覆盖墙壁
  • AMO:超灵巧人形机器人全身控制的自适应运动优化
  • 前端学习 7:EDA 工具
  • 板块三章节3——NFS 服务器
  • SupChains技术团队:需求预测中减少使用分层次预测(五)
  • 写Rust GPU内核驱动:GPU驱动工作原理简述
  • SymPy 中 atan2(y, x)函数的深度解析
  • CentOS 7 安装 Anaconda
  • 14天搞定Excel公式:告别加班,效率翻倍!
  • Windows Oracle 11 g dmp数据库恢复笔记
  • mysql 索引失效分析
  • 全面解析 URL 重定向原理:从协议、实现到安全实践
  • X4000 私有 5G 实验室入门套件
  • 亚马逊采购风控突围:构建深度隐匿的环境安全体系