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

【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容

在这里插入图片描述

指针2.0

  • 传值调用与传址调用
    • 传值调用
    • 传址调用
  • 一维数组与指针
    • 理解数组名
    • 使用指针
    • 深入理解一维数组
  • 二级指针
  • 指针数组
  • 二维数组与指针

传值调用与传址调用

在开始之前,我们需要先了解这个概念,后面才能够正常的学习

传值调用

int add(int x, int y)
{return x + y;
}
int main()
{int a = 10;int b = 20;int c = add(a, b);printf("%d", c);return 0;
}

经典的传值调用,只需要传值即可,没有过多的要求,但如果我们的要求是将ab互换大小,再用这样的代码就行不通了

void ecn(int x, int y)
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 10;int b = 20;ecn(a, b);printf("a = %d\n", a);printf("b = %d\n", b);return 0;
}

在这里插入图片描述
我们发现,这样做交换不了两者的值,是因为形参是实参的一份临时拷贝,形参也是有地址的,改变形参影响不了实参,这时我们只能进行传址调用

传址调用

void ecn(int* x,int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
int main()
{int a = 10;int b = 20;ecn(&a, &b);printf("a = %d\n", a);printf("b = %d\n", b);return 0;
}

在这里插入图片描述
这样就能进行调换了,改变实参的值

一维数组与指针

理解数组名

int arr[5] = {1,2,3,4,5};

当我们想要访问arr数组时,我们有一下几种方法

int i = arr[0];
int* p = &arr[0];
int* p = arr;

第一种不必多说,利用访问下标操作符对数组进行访问。第二、三种是我们上一篇文章说的(可移步上一篇:指针初阶),通过指针对数组进行访问,arr与&arr[0]是一样的,都是数组的首元素地址
那我们可能会有疑问了:那&arr是什么样的呢,跟这两个也一样吗?下面我们用编译器来测试下,顺便证明一下第二三种是一样的
打印它们的地址

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5 };printf("&arr[0] = %p\n", &arr[0]);printf("arr =     %p\n", arr);printf("&arr =    %p\n", &arr);return 0;
}

在这里插入图片描述
我们发现它们的地址都是相同的,那它们都相同吗?我们再来看一下

#include <stdio.h>
int main()
{int arr[5] = { 1,2,3,4,5 };printf("%d\n", sizeof(arr));return 0;
}

在这里插入图片描述
如果它们都相同,那么sizeof(arr)与sizeof(arr【0】)应该相同,那应该在32位下为4,只有整个数组的大小才为20,这与我们之前所看到的相悖,我们最后来看一下区别在哪

#include <stdio.h>
int main()
{int arr[5] = { 1,2,3,4,5 };printf("&arr[0] =   %p\n", &arr[0]);printf("&arr[0]+1 = %p\n", &arr[0] + 1);printf("arr =       %p\n", arr);printf("arr+1 =     %p\n", arr + 1);printf("&arr =      %p\n", &arr);printf("&arr+1 =    %p\n", &arr + 1);return 0;
}

在这里插入图片描述
我们可以看到&arr+1跟另外两个不同,地址加了20,而另外两个加了4;正如我们所想,arr确实代表着一个数组,但&arr取的是首元素的地址,整个数组是一个整体

使用指针

#include <stdio.h>
int main()
{int arr[5] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (i = 0; i < sz; i++){scanf("%d", p + i);}for (i = 0; i < sz; i++){printf("%d ", p[i]);//这里*(p+i)=p[i]}return 0;

数组元素的访问在编译器处理的时候转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问。

深入理解一维数组

当我们写函数的时候,如果想要改变数组的内容:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
其实这个也是想当然的,因为数组可以用指针来表示,二者等同,那么取而代之肯定也是非常正确的,因为数组的本质就是指针

二级指针

二级指针的概念也很简单,就是存放一级指针的地址的指针

int main()
{int i = 10;int* pi = &i;int** ppi = &pi;return 0;
}
*ppi = pi;
**ppi = i;

同理,存放二级指针地址的就是三级指针

指针数组

指针数组就是存放指针的数组,里边每个元素都是地址

int* arr1;//里边的指针类型全部为int*
char* arr2;//里边的指针类型全部为char*

二维数组与指针

#include <stdio.h>
int main()
{int arr1[5] = { 1,2,3,4,5 };int arr2[5] = { 2,3,4,5,6 };int arr3[5] = { 3,4,5,6,7 };int* parr[3] = { arr1, arr2, arr3 };//我们一般把p作为指针变量,后面加上arr表示是数组指针变量,有关于数组指针变量的知识我们下期再分享int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

我们看到很熟悉的parr[ i ][ j ]的形式,这其实就是二维数组的真正形态,在运行时二维数组也是要先变成指针的形式再进行运算的,所以说数组的本质是指针

这篇2.0就到这里了,感谢阅读
在这里插入图片描述

相关文章:

【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容 指针2.0 传值调用与传址调用传值调用传址调用 一维数组与指针理解数组名使用指针深入理解一维数组 二级指针指针数组二维数组与指针 传值调用与传址调用 在开始之前&#xff0c;我们需要先了解这个概念&#xff0c;后面才能够正常的学习…...

小红书关键词爬虫

标题 1 统计要收集的关键词&#xff0c;制作一个文件夹2 爬取每一页的内容3 爬取标题和内容4 如果内容可以被查看&#xff0c;爬取评论内容5 将结果进行汇总&#xff0c;并且每个帖子保存为一个json文件&#xff0c;具体内容6 总结 1 统计要收集的关键词&#xff0c;制作一个文…...

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…...

2024/2/29 备战蓝桥杯 6-1 二分

目录 查找 【深基13.例1】查找 - 洛谷 数对 A-B 数对 - 洛谷 砍树 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 参考连接&#xff1a;AcWing 789. 数的范围---二分法一次搞懂 - AcWing 1.程序中不要同时出现l mid, r mdi这两条语句。 2.如过程序中出现了l mid&#xff0…...

浅析ARMv8体系结构:原子操作

文章目录 概述LL/SC机制独占内存访问指令多字节独占内存访问指令 独占监视器经典自旋锁实现 LSE机制原子内存操作指令CAS指令交换指令 相关参考 概述 在编程中&#xff0c;当多个处理器或线程访问共享数据&#xff0c;并且至少有一个正在写入时&#xff0c;操作必须是原子的&a…...

综合练习(二)

目录 列出薪金比 SMITH 或 ALLEN 多的所有员工的编号、姓名、部门名称、领导姓名、部门人数&#xff0c;以及所在部门的平均工资、最高和最低工资 补充 spool Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金比 SMITH 或 AL…...

sql-labs第46关(order by盲注脚本)

一、环境 网上有自己找 二、解释 order by 注入我们看他的true和false来进行注入出来 二、实操 让我们用sort 看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username&#xff1a; password&#xff1a; 可以看到顺序是不…...

13款可以轻松上手画图软件推荐

在当今的数字世界里&#xff0c;我们有各种各样的创作工具&#xff0c;尤其是画图软件。所以问题来了&#xff1a;我们应该如何选择许多免费的绘画软件&#xff1f;为了回答这个问题&#xff0c;我们将在本文中分享10个领先的画图软件。每一个都有其独特的特点和优势&#xff0…...

vue实现商品评分效果(通过插件实现)

Vue.js 实现了一个简单的商品评分功能。用户可以通过点击星星来修改商品的评分&#xff0c;并且评分显示了相应的星星数。 废话不多说&#xff0c;直接上代码 方法一&#xff1a; <template><div><avue-form :model"formData"><avue-form-it…...

SpringBoot 手写 Starter

spring-boot-starter 模块 1.介绍 SpringBoot中的starter是一种非常重要的机制&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启动相应的默认配…...

C++ 学习笔记(Structured bindings)

C 学习笔记&#xff08;Structured bindings&#xff09; 这个特性是 C17 引入的&#xff0c;个人认为主要是解决如何让函数返回多个值的问题。在这之前&#xff0c;我们一般用 std::pair 或者 std::tuple 来返回多个值。比如下面的例子&#xff1a; std::tuple<int, int …...

K8S常用kubectl命令汇总(持续更新中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

加密和签名的区别及应用场景

原文网址&#xff1a;加密和签名的区别及应用场景_IT利刃出鞘的博客-CSDN博客 简介 本文介绍加密和签名的区别及应用场景。 RSA是一种非对称加密算法&#xff0c; 可生成一对密钥&#xff08;私钥和公钥&#xff09;。&#xff08;RSA可以同时支持加密和签名&#xff09;。 …...

双非二本找实习前的准备day3

学习目标&#xff1a; 每天2-3到简单sql&#xff08;刷完即止&#xff09;&#xff0c;每天复习代码随想录上的题目3道算法&#xff08;时间充足可以继续&#xff09;&#xff0c;背诵的八股的问题也在这里记录了 今日碎碎念&#xff1a; 1&#xff09;偶尔还是贪玩游戏&…...

又挖到宝了!国人团队研发的AI视频工具PixVerse,这么好用居然还完全免费!(强烈推荐)

昨天发了一款国产免费的 AI 绘画工具 Dreamina 的介绍&#xff1a; 居然才发现&#xff01;字节跳动旗下国产AI绘画工具Dreamina&#xff0c;这么好用居然还免费&#xff01;&#xff08;强烈推荐&#xff09; 发现大家对国产 AI 工具还挺感兴趣的。今天继续帮大家挖国产的 A…...

勒索病毒普通用户防范建议

勒索病毒普通用户防范建议 定期备份存储在计算机上的数据&#xff0c;这样勒索软件感染不会永远破坏您的个人数据。 最好创建两个备份副本&#xff1a;一个存储在云中&#xff08;记住使用一个自动备份文件的服务&#xff09;&#xff0c;另一个物理存储&#xff08;便携式硬…...

Zabbix“专家坐诊”第231期问答

问题一 Q&#xff1a;用docker-compose部署zabbix&#xff0c;部署完后如果要修改zabbix的配置应该要改docker-compose文件里的环境变量吧&#xff1f;改了环境变量之后只能重建容器才能生效吗&#xff1f;能不能在不影响已经配好的那些监控项的情况下让新的环境变量生效&#…...

【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流 文章目录 【.NET Core】深入理解IO - FileSteam流一、IO流概述二、文件流FileStream2.1 FileStream概述2.2 FileStream检测流位置更改2.3 FileStream构造函数2.4 FileStream常用属性2.5 FileStream.Read方法2.6 FileStream.Write方法2.7…...

CentOS7 Mysql 忘记密码或临时密码进不去时怎么跳过密码进去然后再更改密码

CentOS7 Mysql 忘记密码或临时密码进不去时怎么跳过密码进去然后再更改密码 1、进文件 vi /etc/my.cnf2、加skip-grant-tables设置跳过密码 在[mysqld]下面加 skip-grant-tables3、mysql -u root -p直接回车无密码进去mysql mysql -u root -p3、先更新&#xff0c;不执行这…...

深度学习 精选笔记(8)梯度消失和梯度爆炸

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…...

第二十一章 项目启动与治理架构:从招标到甲乙方协作机制的建立

第四篇 项目交付与工程管理写代码是工程&#xff0c;交付是艺术与政治的混合体。 第四篇解决的是一个在技术书籍里经常被回避的核心问题&#xff1a;如何在复杂的国企环境、多供应商格局和真实的一线压力下&#xff0c;把一个工业互联网系统真正交到用户手里&#xff0c;并让它…...

软件代理管理中的访问控制层

软件代理管理中的访问控制层是确保系统安全与合规性的核心组件。随着数字化转型加速&#xff0c;软件代理广泛应用于自动化任务、数据采集和跨系统交互&#xff0c;但其开放性和灵活性也带来了潜在风险。访问控制层通过精细化权限管理&#xff0c;成为平衡效率与安全的关键技术…...

AIAgent能支撑AGI吗?SITS2026圆桌激辩实录:8大底层能力缺口与2026年前必须攻克的3座技术高峰

第一章&#xff1a;SITS2026圆桌&#xff1a;AIAgent与AGI的关系 2026奇点智能技术大会(https://ml-summit.org) AIAgent 与 AGI 并非线性演进关系&#xff0c;而是认知架构、目标建模与自主演化能力的质变交界。在 SITS2026 圆桌讨论中&#xff0c;多位前沿研究者指出&#…...

高通平台ramdump-parser实战:从环境搭建到深度解析

1. 高通平台ramdump分析入门指南 第一次拿到高通设备的ramdump文件时&#xff0c;我和大多数工程师一样手足无措。这些二进制文件就像黑匣子&#xff0c;记录着设备崩溃前的最后状态。ramdump-parser正是高通官方提供的"解码器"&#xff0c;能把晦涩的二进制数据转化…...

CefFlashBrowser:Flash内容兼容性一站式终极解决方案

CefFlashBrowser&#xff1a;Flash内容兼容性一站式终极解决方案 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 当Flash技术正式退出历史舞台&#xff0c;那些曾经承载着无数人童年回忆的…...

容器网络方案

容器网络方案&#xff1a;构建云原生时代的连接桥梁 在云原生和微服务架构盛行的今天&#xff0c;容器技术已成为应用部署的核心载体。如何高效、安全地管理容器间的通信&#xff0c;成为开发者必须面对的挑战。容器网络方案正是解决这一问题的关键&#xff0c;它不仅需要满足…...

如何快速为旧iPhone降级:Legacy-iOS-Kit完整使用指南

如何快速为旧iPhone降级&#xff1a;Legacy-iOS-Kit完整使用指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你…...

DAMO-YOLO手机检测部署教程:多线程并发请求压力测试与QPS优化

DAMO-YOLO手机检测部署教程&#xff1a;多线程并发请求压力测试与QPS优化 1. 引言 你有没有遇到过这样的场景&#xff1f;开发了一个看起来不错的AI模型服务&#xff0c;自己测试时响应飞快&#xff0c;但一旦有多个用户同时访问&#xff0c;服务就变得卡顿甚至崩溃。对于手机…...

告别手动敲代码!Quartus Prime 21.1 一键生成 Testbench 并联动 Modelsim 仿真的保姆级教程

Quartus Prime 21.1全自动Testbench生成与Modelsim仿真实战指南 在FPGA开发中&#xff0c;仿真验证环节往往占据整个项目周期的40%以上时间。传统手动编写Testbench的方式不仅效率低下&#xff0c;还容易因人为疏忽导致仿真结果与硬件行为不匹配。Quartus Prime 21.1内置的自动…...

天问ESP32C3-Pro语音大模型对话:从硬件连接到云端部署的完整实践

1. 硬件准备与接线指南 想要实现语音大模型对话功能&#xff0c;首先得搞定硬件部分。我用的是一套性价比极高的组合&#xff1a;ESP32C3-Pro开发板搭配INMP441麦克风模块和MAX98357功放模块。这套设备总成本不到百元&#xff0c;但效果却出乎意料的好。 先说说INMP441麦克风的…...