燃烧的指针(二)

🌈个人主页:小田爱学编程
🔥 系列专栏:c语言从基础到进阶
🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆


😀欢迎来到小田代码世界~
😁 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა


目录

一. 解决疑问

二.数组名的理解

二.使用指针访问数组

三.传参的本质

四.一维数组传参的本质

五.排序

 六.assert断言

七.二级指针

 八.指针数组

九.字符指针变量

十.数组指针

十一.函数指针

十二.函数指针数组

十三.烧脑问题


一. 解决疑问

上次,我们提出了在函数中我们学过函数,形参是实参的一份临时拷贝,也就是在函数中的形参再怎么改也不会影响实参,那为啥会出现下面的情况呢?

😀如果你想知道这个问题的答案,那么你看完这篇文章,你一定会发现问题的答案的。

二.数组名的理解

🌏数组名就是数组首元素的地址

  ☀特例:1.sizeof中单独放数组名,即sizeof[arr]中的不是数组的首个,而是整个数组

  特例:2. &arr这里的数组是整个数组

又有:在这里看出这三种方式没有区别,那区别究竟在哪里?

  从上述例子我们可以看出,数组首个首元素的地址和整个数组的地址就会有明显的差别

二.使用指针访问数组

🌏(*p+i)=(*arr+i)=(p+i)=(arr+i)

🌏p[i]=i[p]=arr[i]=*p=*i

三.传参的本质

😀为啥这个不起作用呢?

形参是实参的一份临时拷贝,但是本质是啥呢?

 由打开调试可知,a,b,x,y的地址不一样,这就比如我和你在不同的房间(这个房间离得很远),我和你也不认识,那当然你做什么肯定不会影响我呀,这里的同样是一个道理,我们这样紫就更加的加深了我们对形参是实参的一份临时拷贝的理解了,我们现在学习了指针,就可以进行修改喽

四.一维数组传参的本质

🌏⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

五.排序

迈入算法的大门,从排序开始,从冒泡排序开始:

视频:

C语言冒泡排序和选择排序(这应该是讲的最详细的一个视频了)

思路:

排序的构建方法有很多,一种就是比较相邻的元素

举例:

代码:👨‍🚀但是,如果一组数是0,1,2,3,4,9,8,7,6,5按照升序去排序,如果本身有的数字为有序,那么再去       比较会导致效率降低:我们引入count计数器,发现按照上方的算法排序,需要45次

👨‍🌾我们可以用flag进行判断,先假设有序,如果有序就排序,没序就跳出循环

 六.assert断言

  #define NDEBUG
  #include <assert.h>

 👨‍🌾assert表示判断的意思

 👨‍🚀加入宏#define NDEBUG,可以自动取消assert断言的使用(在release版本)会出现

七.二级指针

 🌏二级指针变量存放一级指针变量的地址:int**pa=&a

 🌏**pa ->可以找到a并把a的值给改变

 八.指针数组

 👨‍🚀是一群指针放在数组里面,构成的指针数组

 🐎指针数组举例:int* parr[3] = {arr1, arr2, arr3};

      可以用指针数组来模拟二维数组的实现:

九.字符指针变量

int main()
{
 char ch = 'w';
 char *pc = &ch;
 *pc = 'w';
 return 0;

}

 🌏字符指针变量不可变,在内存中申请空间时同一串常量申请的空间相同

十.数组指针

👉数组指针:指向数组的指针,eg int(*pa)[10]=arr,解释:pa是数组名,*p是指这个是指针变量,       有十个元素,且指向的对象是int类型,准确的说其类型是:int(*)[10] ,或这个是个数组指         针,类型是int(*)[10]int(*)[10]

 👉[]的优先级要⾼于*号的,若是int*p[10]=arr,则是指针数组

 🌏⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址

 🌏void test(int (*p)[5], int r, int c)

 🌏⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式,同样一维数组等同

十一.函数指针

🐟指针指向的对象是函数

🐟格式:

 🐟举例:

十二.函数指针数组

 👨‍🚀 地址存到⼀个数组中,那这个数组就叫函数指针数组

 👨‍🚀int (*parr1[3])();

十三.烧脑问题

 通过以上的学习:想必大家已经对这两个问题可以做出很好的解释:

 😀(*(void (*)())0)(); 

 😀void (*signal(int , void(*)(int)))(int); 


👍如果想知道答案,请持续关注🥇系列专栏:c语言从基础到进阶

🎁🎁🎁今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos 虚拟机安装

转自 气质&末雨的博客 Centos 虚拟机安装_centos虚拟机安装教程-CSDN博客

CentOS 7.9 OS Kernel Update 3.10 to 4.19

date: 2024-01-18, 2024-01-26 原 OS Kernel 3.10 升级至 4.19 1.检查默认内核 检查 vmlinuz 版本 [rootlocalhost ~]# grubby --default-kernel /boot/vmlinuz-3.10.0-1160.105.1.el7.x86_64 [rootlocalhost ~]#检查 Linux 内核版本 [rootlocalhost ~]# uname -a Linux loc…

Tree-Shaking 作用和实现原理

一、什么是Tree-shaking Tree-shaking 它的名字来源于通过摇晃&#xff08;shake&#xff09;JavaScript代码的抽象语法树&#xff08;AST&#xff09;&#xff0c;是一种用于优化JavaScript代码的技术&#xff0c;主要用于移除未被使用的代码&#xff0c;使得最终生成的代码包…

大模型应用开发:为产品创建一个AI客服/智能助手

欢迎阅读本系列文章&#xff01;我将带你一起探索如何使用OpenAI API来开发GPT大模型应用。无论你是编程新手还是资深开发者&#xff0c;都能在这里获得灵感和收获。 本文将继续展示AI助手的开发方式&#xff0c;在OpenAPI中它的名字是Assistants。 什么是Assistants&#xf…

Python网络爬虫实战——实验4:Python爬虫代理的使用

【实验内容】 本实验主要介绍在爬虫采集数据的过程中代理的使用。 【实验目的】 1、掌握代理使用的基本场景&#xff1b; 2、解决IP封锁问题&#xff1b; 3、提高爬虫访问效率&#xff1b; 【实验步骤】 步骤1选择代理服务提供商 步骤2配置爬虫使用代理 步骤3 采集数据生成…

Rust复合类型之元组

元组是一个有着固定&#xff08;元素&#xff09;长度的列表&#xff0c;每个元素的类型有可能是不同的。类型和元素都用小括号括起来&#xff0c;它们之间用逗号隔开。例如&#xff1a; fn main() { let itemname: (i32, f64, u8) (500, 6.4, 1); }元组可以使用.来访问其中的…

priority_queue模拟

文章目录 模拟priority_queue性质&#xff1a;成员函数&#xff1a;向上调整、向下调整push/pop/empty/top/size/empty成员变量 仿函数struct和class练习题堆的一些性质 模拟priority_queue 性质&#xff1a; 是容器适配器&#xff1b; 底层逻辑是堆&#xff0c;适配器是vect…

Android MVVM+Clean架构简介

本文主要介绍Android开发中MVVM Clean架构。 一、ViewModel ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面&#xff0c;以及封装相关的业务逻辑。 它的主要优点是&#xff0c;它可以缓存状态&#xff0c;并可在配置更改后持久保留相应状态。这意味着在 …

音频筑基:窄带、宽带、超宽带、全带一次说透

音频筑基&#xff1a;窄带、宽带、超宽带、全带一次说透 窄带、宽带、超宽带、全带定义参考资料 音频信号中&#xff0c;经常遇到窄带、宽带等说法&#xff0c;本文进行一个小结归类。 窄带、宽带、超宽带、全带定义 窄带、宽带到全带&#xff0c;总体来说是&#xff0c;指对音…

Android JNI中设置全局的jbyteArray

在JNI的代码文件中声明一个全局变量&#xff0c;用来存储jbyteArray对象。你可以在JNI的头文件中定义该变量。 static jbyteArray globalByteArray;在JNI的某个函数中&#xff0c;将传递的jbyteArray对象赋值给全局变量。 JNIEXPORT void JNICALL Java_com_example_MyClass_set…

【遥感专题系列】影像信息提取之——基于专家知识的决策树分类

可以将多源数据用于影像分类当中&#xff0c;这就是专家知识的决策树分类器&#xff0c;本专题以ENVI中Decision Tree为例来叙述这一分类器。 本专题包括以下内容&#xff1a; 专家知识分类器概述知识&#xff08;规则&#xff09;定义ENVI中Decision Tree的使用 概述 基于知…

数据结构与算法——队列

概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。添加的一端称为尾&#xff0c;移除的一端称为头。 功能 插入offer(value : E) : boolean  取值并移除poll() : E  取值peek() : E  判断…

LeetCode 40.组合总和 II

组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 方法一、回溯 由于题目要求解集…

实体识别与分类方法综述

目录 前言1 实体识别简介2 基于模板和规则的方法3 基于序列标注的方法3.1 常见序列标注模型3.2 模型参数估计和学习问题3.3 常见序列预测模型 4. 基于深度学习的实体识别方法5 基于预训练语言模型的实体识别5.1 BERT、GPT等预训练语言模型5.2 解码策略 6 特殊问题与挑战6.1 标签…

如何提高记忆力?

许多学员经常问我&#xff1a;为什么您的记忆力那么好&#xff1f;有没有什么方法&#xff0c;可以提高记忆力&#xff1f; 今天&#xff0c;我想好好聊聊这个问题。 当然&#xff0c;学习和记忆&#xff0c;是一个巨大的话题。这篇文章只是一个初探。希望能帮你打开一些视野&a…

关于java中static详解

关于java中static详解 我们接触static的时候不是在学习面向对象的时候接触的&#xff0c;是在学习方法的时候就有过接触&#xff0c;我们之前对static的了解只是静态的修饰&#xff0c;本篇文章我们对static这个修饰符做一个详细的理解&#x1f600;。 static 如果在属性上&a…

深入理解Redis:如何设置缓存数据的过期时间及其背后的机制

目录 Redis 给缓存数据设置过期时间 Redis是如何判断数据是否过期的呢&#xff1f; 过期的数据的删除策略 Redis 内存淘汰机制 Redis 给缓存数据设置过期时间 一般情况下&#xff0c;我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢&#xff1f; 因为内存是有…

算法训练营Day48(动态规划9)

说明 今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;可以一口气拿下。 198.打家劫舍 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution:def rob(self, nums: List[int]) -> int:if len(nums) 0: # 如果没有房屋&a…

电流检测电路设计方案汇总

电流检测电路设计方案&#xff08;一&#xff09; 低端检流电路的检流电阻串联到地&#xff08;图1&#xff09;&#xff0c;而高端检流电路的检流电阻是串联到高电压端&#xff08;图2&#xff09;。两种方法各有特点&#xff1a;低端检流方式在地线回路中增加了额外的线绕电…

​ElasticSearch

目录 简介 基本概念 倒排索引 FST 简介 ES是一个基于lucene构建的&#xff0c;分布式的&#xff0c;RESTful的开源全文搜索引擎。支持对各种类型的数据的索引&#xff1b;搜索速度快&#xff0c;可以提供实时的搜索服务&#xff1b;便于水平扩展&#xff0c;每秒可以处理 …