C语言学习系列-->看淡指针(2)

文章目录
- 前言
- 一、数组名的理解
- 二、使用指针访问数组
- 三、一维数组传参本质
- 四、二级指针
- 五、指针数组
- 六、指针数组模拟二维数组
前言
不把指针学的扎实,可不敢说自己C语言基础学的好
一、数组名的理解
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] = %p\n", &arr[0]);printf("arr = %p\n", arr);return 0;
}
输出结果

所以,数组名就是数组第一个元素的地址
数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:
• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,
单位是字节
• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)
除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };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[0] = 0077F820
&arr[0]+1 = 0077F824
arr = 0077F820
arr+1 = 0077F824
&arr = 0077F820
&arr+1 = 0077F848
这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是
⾸元素的地址,+1就是跳过⼀个元素。
但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。
二、使用指针访问数组
#include<stdio.h>int main() {int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;int i = 0;for (i = 0; i < sz; i++) {scanf("%d", p + i);//也可以写成scanf("%d",arr+i);}for (i = 0; i < sz; i++) {printf("%d ", *(p + i));}return 0;
}
本质上p[i] 是等价于 *(p+i),arr[i] 应该等价于 *(arr+i)
三、一维数组传参本质
之前我们都是在函数外部求数组的个数,那如果在函数内部呢?
数组名是数组⾸元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址。
所以函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址。那么在函数内部我们写
sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函
数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。
#include<stdio.h>void test(int arr[]) {printf("%d\n", sizeof(arr));
}void test(int* arr) {printf("%d", sizeof(arr));
}int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };test(arr);return 0;
}
⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
四、二级指针
是变量都有地址
那么,指针变量也是变量,它的地址在哪呢?
存放在二级指针中

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa
int b = 20;
*ppa = &b;//等价于 pa = &b;
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a .
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
五、指针数组
指针数组,是一个数组,数组里面每一个元素的类型都是指针类型

数组指针的每个元素是地址,⼜可以指向⼀块区域。
六、指针数组模拟二维数组
#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 };int i = 0;int j = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 5; j++) {printf("%d ", parr[i][j]);//printf("%d", *(*(parr + i) + j));//parr[i][j] == *(*(parr + i) + j);}printf("\n");}return 0;
}

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。
上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。

相关文章:
C语言学习系列-->看淡指针(2)
文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实,可不敢说自己C语言基础学的好 一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4…...
Java基础篇--Character 类
Character 类是用来操作单个字符的,它将 char 值包装在一个对象中。 实际上,在 Java 中,char 是基本数据类型,而 Character 是 char 的包装类。通过 Character 类,可以使用一系列方法来操作字符。在创建 Character 对…...
Flutter参考资料
Flutter 官网 : https://flutter.dev/ Flutter 插件下载地址 : https://pub.dev/packages Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 ) 官方 GitHub 地址 : https://github.com/flutter Flutter 中文社区 : https://flutter.cn/ Flutter 实用教程 : https://flut…...
sed命令如何正确修改ini配置文件
需要保证key值的唯一性 function sed_key_value_file(){key$(echo "$1" | sed s/[\/&]/\\&/g)value$(echo "$2" | sed s/[\/&]/\\&/g)# 先删除原有的value,然后添加新的keyvaluesed -i -e "s#${key}.*#${key}${value}#&q…...
【新版系统架构补充】-信息系统基础知识
信息系统 信息系统的5个基本功能:输入、存储、处理、输出和控制 信息系统的分类(低级到高级):业务(数据)处理系统(TPS/DPS)、管理信息系统(MIS)、决策支持系…...
安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?
众所周知,TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入,包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上,视频监控…...
前端遇到的面试题
1.水平垂直居中 绝对定位 transform position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);绝对定位 margin(子元素宽高知道的情况下) position:absolute; top:50%; left:50%; margin-top:-100px; margin-left:-100px;绝对定位 margin:auto position:a…...
abbitmq启动访问不了http://localhost:15672 通过修改服务登录admin
abbitmq默认的对Administration授权,而我的用户不是默认的Administration,所以后来打开服务,找到rabbitmq服务,属性,登陆,将本地系统账户修改为此账户,修改完成之后再重启服务,这时候…...
换架 3D 飞机,继续飞呀飞
相信大多数图扑 HT 用户都曾见过这个飞机的 Demo,在图扑发展的这十年,这个 Demo 是许多学习 HT 用户一定会参考的经典 Demo 之一。 这个 Demo 用简洁的代码生动地展示了 OBJ 模型加载、数据绑定、动画和漫游等功能的实现。许多用户参考这个简单的 Demo 后…...
js ?? || 使用方法
平时很常用的就是||,比如调用接口的时候,接口报错了需要给个默认值 const data(await getData())||{};今天遇到了一个场景,正常后端返回的就是false,如果接口报错要默认设置成true,但如果用了 || ,如下,那…...
i茅台自动申购算法协议分析
首发地址:http://zhuoyue360.com/crack/104.html 一、引言 今日看到有人分享了i茅台自动申购的文章。但是它酷似引流文章,全文一张图,呜呜呜。无法白嫖。太可恶了,因此,我来啦~ 我来整一整,我也要抢茅子! …...
【HarmonyOS】Java如何引用外部jar包
【关键字】 Java、引用jar包 【写在前面】 使用API6和API7开发HarmonyOS应用时,因为应用中只能引用SDK中开放的功能接口,但是部分jdk自带的接口功能在SDK中并未封装,要想在工程中使用jdk开放的接口功能,需要将jdk中的jar包通过…...
vue在线编辑表格导入导出
npm i file-saver npm i exceljs npm i luckyexcelindex.html (方式一在html中引入) <link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/luckysheetlatest/dist/plugins/css/pluginsCss.css /><link relstylesheet hrefhttps://cdn.jsde…...
监控Kafka的关键指标
Kafka 架构 上面绿色部分 PRODUCER(生产者)和下面紫色部分 CONSUMER(消费者)是业务程序,通常由研发人员埋点解决监控问题,如果是 Java 客户端也会暴露 JMX 指标。组件运维监控层面着重关注蓝色部分的 BROKE…...
React18 hook学习笔记
useState useState用于在函数组件中声明和管理状态 它接受初始状态,并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数,可以改变状态的值并触发组件的重新渲染 import { useState } from "react"function App() {const [obj, …...
Java038——正则表达式
一、认识正则表达式 正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,“\d”表示数字 0~9 中的任何一个,“d”就…...
JavaScript元素选择器
目录 一、getElementsByTagName1.说明2.用法示例 二、getElementsByName1.说明2.用法示例 三、getElementById1.说明2.用法示例 四、getElementsByClassName1.说明2.用法示例 五、querySelector1.说明2.用法示例 六、querySelectorAll1.说明2.用法示例 七、综合示例 一、getEle…...
Docker安装 elasticsearch-head
目录 前言安装elasticsearch-head步骤1:准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2:拉取elasticsearch-head镜像拉取镜像查看已拉取的镜像 步骤3:创建容器创建容器方式1&#…...
交换排序——选择排序和冒泡排序的区别是什么?
今天重温一下算法,其实刚开始我觉得冒泡排序和选择排序是一样的,因为他们排序过程中都是通过相邻的数据比较找到最小/最大的数据,通过不断思考和学习才明白,两者还是有区别的。 冒泡排序 概念 冒泡排序(Bubble Sort)࿰…...
吉他谱:Melodies of Life - Final Fantasy Solo Guitar Collections
原始出处: Final Fantasy Solo Guitar Collections - 南泽大介改编的最终幻想9主题曲吉他谱 更多吉他谱: https://github.com/NaisuXu/Guitar_Sheet_Music_Collection...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
