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

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)

文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实&#xff0c;可不敢说自己C语言基础学的好 一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4…...

Java基础篇--Character 类

Character 类是用来操作单个字符的&#xff0c;它将 char 值包装在一个对象中。 实际上&#xff0c;在 Java 中&#xff0c;char 是基本数据类型&#xff0c;而 Character 是 char 的包装类。通过 Character 类&#xff0c;可以使用一系列方法来操作字符。在创建 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&#xff0c;然后添加新的keyvaluesed -i -e "s#${key}.*#${key}${value}#&q…...

【新版系统架构补充】-信息系统基础知识

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制 信息系统的分类&#xff08;低级到高级&#xff09;&#xff1a;业务&#xff08;数据&#xff09;处理系统&#xff08;TPS/DPS&#xff09;、管理信息系统&#xff08;MIS&#xff09;、决策支持系…...

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…...

前端遇到的面试题

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授权&#xff0c;而我的用户不是默认的Administration&#xff0c;所以后来打开服务&#xff0c;找到rabbitmq服务&#xff0c;属性&#xff0c;登陆&#xff0c;将本地系统账户修改为此账户&#xff0c;修改完成之后再重启服务&#xff0c;这时候…...

换架 3D 飞机,继续飞呀飞

相信大多数图扑 HT 用户都曾见过这个飞机的 Demo&#xff0c;在图扑发展的这十年&#xff0c;这个 Demo 是许多学习 HT 用户一定会参考的经典 Demo 之一。 这个 Demo 用简洁的代码生动地展示了 OBJ 模型加载、数据绑定、动画和漫游等功能的实现。许多用户参考这个简单的 Demo 后…...

js ?? || 使用方法

平时很常用的就是||,比如调用接口的时候&#xff0c;接口报错了需要给个默认值 const data(await getData())||{};今天遇到了一个场景&#xff0c;正常后端返回的就是false&#xff0c;如果接口报错要默认设置成true&#xff0c;但如果用了 || &#xff0c;如下&#xff0c;那…...

i茅台自动申购算法协议分析

首发地址:http://zhuoyue360.com/crack/104.html 一、引言 今日看到有人分享了i茅台自动申购的文章。但是它酷似引流文章&#xff0c;全文一张图&#xff0c;呜呜呜。无法白嫖。太可恶了&#xff0c;因此&#xff0c;我来啦~ 我来整一整&#xff0c;我也要抢茅子&#xff01; …...

【HarmonyOS】Java如何引用外部jar包

【关键字】 Java、引用jar包​ 【写在前面】 使用API6和API7开发HarmonyOS应用时&#xff0c;因为应用中只能引用SDK中开放的功能接口&#xff0c;但是部分jdk自带的接口功能在SDK中并未封装&#xff0c;要想在工程中使用jdk开放的接口功能&#xff0c;需要将jdk中的jar包通过…...

vue在线编辑表格导入导出

npm i file-saver npm i exceljs npm i luckyexcelindex.html &#xff08;方式一在html中引入&#xff09; <link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/luckysheetlatest/dist/plugins/css/pluginsCss.css /><link relstylesheet hrefhttps://cdn.jsde…...

监控Kafka的关键指标

Kafka 架构 上面绿色部分 PRODUCER&#xff08;生产者&#xff09;和下面紫色部分 CONSUMER&#xff08;消费者&#xff09;是业务程序&#xff0c;通常由研发人员埋点解决监控问题&#xff0c;如果是 Java 客户端也会暴露 JMX 指标。组件运维监控层面着重关注蓝色部分的 BROKE…...

React18 hook学习笔记

useState useState用于在函数组件中声明和管理状态 它接受初始状态&#xff0c;并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数&#xff0c;可以改变状态的值并触发组件的重新渲染 import { useState } from "react"function App() {const [obj, …...

Java038——正则表达式

一、认识正则表达式 正则表达式通常被用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串&#xff0c;这些特殊字符称为正则表达式的元字符。例如&#xff0c;“\d”表示数字 0~9 中的任何一个&#xff0c;“d”就…...

JavaScript元素选择器

目录 一、getElementsByTagName1.说明2.用法示例 二、getElementsByName1.说明2.用法示例 三、getElementById1.说明2.用法示例 四、getElementsByClassName1.说明2.用法示例 五、querySelector1.说明2.用法示例 六、querySelectorAll1.说明2.用法示例 七、综合示例 一、getEle…...

Docker安装 elasticsearch-head

目录 前言安装elasticsearch-head步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2&#xff1a;拉取elasticsearch-head镜像拉取镜像查看已拉取的镜像 步骤3&#xff1a;创建容器创建容器方式1&#…...

交换排序——选择排序和冒泡排序的区别是什么?

今天重温一下算法&#xff0c;其实刚开始我觉得冒泡排序和选择排序是一样的&#xff0c;因为他们排序过程中都是通过相邻的数据比较找到最小/最大的数据&#xff0c;通过不断思考和学习才明白&#xff0c;两者还是有区别的。 冒泡排序 概念 冒泡排序(Bubble Sort)&#xff0…...

吉他谱:Melodies of Life - Final Fantasy Solo Guitar Collections

原始出处&#xff1a; Final Fantasy Solo Guitar Collections - 南泽大介改编的最终幻想9主题曲吉他谱 更多吉他谱&#xff1a; https://github.com/NaisuXu/Guitar_Sheet_Music_Collection...

【乳腺癌分类】基于图像处理技术和卷积神经网络早发乳腺癌分类附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

SAP SD VL31N创建内向交货单,BAPI调用物料号丢失?一个隐式增强搞定

SAP SD VL31N创建内向交货单&#xff1a;BAPI调用物料号丢失的深度排查与隐式增强实战 最近在实施一个SAP SD模块的采购订单对接项目时&#xff0c;遇到了一个颇为棘手的问题&#xff1a;通过标准BAPI BBP_INB_DELIVERY_CREATE创建内向交货单时&#xff0c;物料号在传输过程中神…...

ABAP批量导入Excel数据实战:从文件选择到数据库插入的完整流程

ABAP高效Excel数据导入&#xff1a;从基础实现到性能优化的完整指南 在企业级SAP系统开发中&#xff0c;Excel数据批量导入是每个ABAP开发者必须掌握的技能。无论是期初数据加载、日常业务数据维护&#xff0c;还是系统间数据交换&#xff0c;高效可靠的数据导入机制都能显著提…...

Get cookies.txt LOCALLY:本地Cookie导出工具的终极安全解决方案

Get cookies.txt LOCALLY&#xff1a;本地Cookie导出工具的终极安全解决方案 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在当今Web开发和自动化…...

告别纯Client模式:手把手教你用CANoe的NetWork Node搭建一个实时监控Server

从被动监听转向主动响应&#xff1a;基于CANoe NetWork Node的车载实时监控系统实战 在传统车载网络测试中&#xff0c;工程师们往往将CANoe作为被动监听工具&#xff0c;通过Trace窗口观察总线数据流。这种"只读"模式虽然能满足基础测试需求&#xff0c;但当面对需要…...

TCN时序卷积网络:从因果与空洞卷积到高效序列建模实战

1. 时序卷积网络TCN的核心设计理念 第一次接触TCN&#xff08;Temporal Convolutional Network&#xff09;时&#xff0c;很多人会疑惑&#xff1a;为什么要在时间序列任务中用卷积网络&#xff1f;毕竟RNN和Transformer才是这个领域的传统强者。但当我真正在项目中尝试用TCN处…...

别再死磕谱域了!GraphSAGE和GAT的采样聚合与注意力机制,手把手教你搞定空域图卷积

空域图卷积实战&#xff1a;从GraphSAGE的邻居采样到GAT的注意力加权 当你在处理社交网络中的用户关系图时&#xff0c;传统的谱域方法可能让你束手无策——新用户不断加入&#xff0c;关系动态变化&#xff0c;而谱域卷积要求固定的图结构。这就是为什么越来越多的开发者开始转…...

MCP41010数字电位器实战指南:从SPI到SGM2211调压

目录 一、MCP41010 芯片定位&#xff1a;最简单的 SPI 数字电位器 核心参数&#xff08;记住就够用&#xff09; 二、引脚功能彻底吃透&#xff08;8 脚 SOIC/SOT23&#xff09; 3 个模拟端&#xff08;最重要&#xff09; 三、工作原理&#xff1a;把它当普通电位器用 四…...

5步搞定MinGW-w64:在Windows上打造专业C/C++开发环境的终极指南

5步搞定MinGW-w64&#xff1a;在Windows上打造专业C/C开发环境的终极指南 【免费下载链接】mingw-w64 (Unofficial) Mirror of mingw-w64-code 项目地址: https://gitcode.com/gh_mirrors/mi/mingw-w64 你是否想在Windows系统上搭建一个功能完整、性能出色的C/C开发环境…...

从华数杯到数学建模:我是如何用CCR模型搞定“脱贫绩效评价”这道题的?

从华数杯到数学建模&#xff1a;我是如何用CCR模型搞定“脱贫绩效评价”这道题的&#xff1f; 凌晨三点的宿舍里&#xff0c;咖啡杯已经见底&#xff0c;我和队友盯着电脑屏幕上那道"脱贫帮扶绩效评价"的赛题面面相觑。这是2020年华数杯数学建模竞赛的C题&#xff0c…...