C语言指针的初步认识--学习笔记(2)

news2024/10/5 13:14:05

1.数组名的理解

我们在使⽤指针访问数组的内容时,有这样的代码:

int arr[10]={1,2,3,4,5,6,7,8,9,10};
int* p=&arr[0];

这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且
是数组⾸元素的地址,我们来做个测试。

int main()
{
	int arr[10] = { 1,2,4,5,6,7,8,9,10 };
	printf("arr[0]=%p\n", &arr[0]);
	printf("arr   =%p\n", arr);
	return 0;
}

输出结果为:


 

2.使指针访问数组

有了对数组名的理解,再结合数组的特点,我们就可以很⽅便的使⽤指针访问数组了。

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++) 
	{
		scanf("%d ", p + i);//输⼊
	}
	for (int i = 0; i < sz; i++)//输出
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

这里我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样,其实数组名就是数组⾸元素(第⼀个元素)的地址
 

这个代码搞明⽩后,我们再试⼀下,如果我们再分析⼀下,数组名arr是数组⾸元素的地址,可以赋值给p,其实数组名arr和p在这⾥是等价的。那我们可以使⽤arr[i]可以访问数组的元素,那p[i]是否也可以访问数组呢?

在第18⾏的地⽅,将*(p+i)换成p[i]也是能够正常打印的,所以本质上p[i]是等价于*(p+i)。
同理arr[i]应该等价于*(arr+i),数组元素的访问在编译器处理的时候,也是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问的。

3.⼀维数组传参的本质

数组是可以传递给函数的,这个⼩节我们讨论⼀下数组传参的本质。⾸先从⼀个问题开始,我们之前都是在函数外部计算数组的元素个数,那我们可以把数组传给⼀个函数后,函数内部求数组的元素个数吗?

void test(int arr[])
{
	int sz2 = sizeof(arr) / sizeof(arr[0]);
	printf("sz2 = %d\n", sz2);
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz1 = sizeof(arr) / sizeof(arr[0]);
	printf("sz1 = %d\n", sz1);
	test(arr);
	return 0;
}

输出结果为:

这里发现在函数内部是没有正确获得数组的元素个数。
这就要学习数组传参的本质了,上个⼩节我们学习了:数组名是数组⾸元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址
 

4. 冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。

那么冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

5. ⼆级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?

想象你有三个变量:一个整型变量 a,一个指针变量 p,和一个二级指针变量 q。它们的关系可以这样表示:

在这个结构中:

  • a 是一个整型变量,它存储了一个值。
  • p 是一个指针变量,它的值是 a 的地址。也就是说,p 指向 a。
  • q 是一个二级指针变量,它的值是 p 的地址。也就是说,q 指向 p。

所以,如果你有一个二级指针 q,你可以通过以下步骤来获取它所指向的原始变量的值:

1.通过 q 获取它所指向的一级指针 p(即 *q)。

2.然后通过一级指针 p 获取它所指向的原始变量 a 的值(即 *p 或 a)。

这个过程通常被称为“解引用”。简而言之,二级指针提供了一种间接访问内存的方式,通过两级指针来访问原始数据。

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

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

相关文章

React 事件机制原理

相关问题 React 合成事件与原生 DOM 事件的区别React 如何注册和触发事件React 事件如何解决浏览器兼容问题 回答关键点 React 的事件处理机制可以分为两个阶段&#xff1a;初始化渲染时在 root 节点上注册原生事件&#xff1b;原生事件触发时模拟捕获、目标和冒泡阶段派发合…

羊大师揭秘羊奶与健康,美味的保健佳品

羊大师揭秘羊奶与健康&#xff0c;美味的保健佳品 羊奶确实是一种美味且健康的保健佳品&#xff0c;其独特的营养成分和风味使其成为许多人的健康选择。以下是一些羊奶与健康的关系&#xff1a; 营养丰富&#xff1a;羊奶含有丰富的蛋白质、脂肪、矿物质和维生素&#xff0c;…

Go字符串实战操作大全!

目录 1. 引言文章结构概览 2. Go字符串基础字符串的定义与特性什么是字符串&#xff1f;Go字符串的不可变性原则 字符串的数据结构Go字符串的内部表达byte和rune的简介 3. 字符串操作与应用3.1 操作与应用字符串连接字符串切片字符串查找字符串比较字符串的替换字符串的大小写转…

【动态规划专栏】

动态规划基础知识 概念 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;用来解决最优化问题的算法思想。 动态规划是分治思想的延伸&#xff0c;通俗一点来说就是大事化小&#xff0c;小事化无的艺术。 一般来说&#xff0c;…

Android 开发环境搭建的步骤

本文将为您详细讲解 Android 开发环境搭建的步骤。搭建 Android 开发环境需要准备一些软件和工具&#xff0c;以下是一些基础步骤&#xff1a; 1. 安装 Java Development Kit (JDK) 首先&#xff0c;您需要安装 Java Development Kit (JDK)。JDK 是 Android 开发的基础&#xf…

教师的调动谁有决定权

当你身边的老师突然“消失”&#xff0c;在另一所学校出现&#xff0c;你是否好奇过&#xff0c;这背后的调动是如何发生的&#xff1f;谁又是这场“迁徙”背后的决定者&#xff1f; 很多人可能首先想到的是校长。毕竟&#xff0c;在学校里&#xff0c;校长似乎是那个“发号施令…

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进&#xff0c;前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说&#xff0c;在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在&#xff0c;本文将梳理前端登录的演变过程。 1、无状态的HTTP H…

【论文阅读】TensoRF: Tensorial Radiance Fields 张量辐射场

发表于ECCV2022. 论文地址&#xff1a;https://arxiv.org/abs/2203.09517 源码地址&#xff1a;https://github.com/apchenstu/TensoRF 项目地址&#xff1a;https://apchenstu.github.io/TensoRF/ 摘要 本文提出了TensoRF&#xff0c;一种建模和重建辐射场的新方法。不同于Ne…

面试题HTML+CSS+网络+浏览器篇

文章目录 Css预处理sass less是什么&#xff1f;为什么使用他们怎么转换 less 为 css&#xff1f;重绘和回流是什么http 是什么&#xff1f;有什么特点HTTP 协议和 HTTPS 区别什么是 CSRF 攻击HTML5 新增的内容有哪些Css3 新增的特性flex VS grid清除浮动的方式有哪些&#xff…

嵌入式入门必经之路:C语言学习计划

1、学习计划 学习基本语法和语言特性&#xff1a; 了解C语言的基本语法结构&#xff0c;如变量、数据类型、运算符等。学习控制流程语句&#xff0c;如条件语句、循环语句等。熟悉函数的定义和使用&#xff0c;包括参数传递和返回值。掌握C语言的输入输出操作&#xff0c;如pri…

力扣hot100:1.两数之和

输入中可能存在重复值 。 分析&#xff1a; 本题需要返回的是数组下标&#xff0c;因此如果需要使用排序然后双指针的话&#xff0c;需要用到哈希表&#xff0c;但是由于输入中可能存在重复值&#xff0c;因此哈希表的value值必须是vector<int>。 使用双指针求目标值targ…

lv20 QT事件5

1 事件模型 2 事件处理 virtual void keyPressEvent(QKeyEvent *event) virtual void keyReleaseEvent(QKeyEvent *event) virtual void mouseDoubleClickEvent(QMouseEvent *event) virtual void mouseMoveEvent(QMouseEvent *event) virtual void mousePressEvent(QMou…

打造专属投屏体验:Windows系统投屏到iOS系统

想要将电脑投屏共享给同事或朋友&#xff0c;又担心隐私内容泄露&#xff1f;来来来&#xff0c;这里有妙招&#xff01; AirDroid Cast网页版让电脑投屏变得挑剔&#xff0c;只展示你允许共享的内容。会议资料、个人照片、敏感文件&#xff0c;都将得到严格的筛选&#xff0c;…

js中find和findLast的区别

一、概念 find()&#xff1a;从数组中查找第一个匹配的元素 findLast()&#xff1a;从数组中查找最后一个匹配的元素 二、用法 array.find((项)>{return 筛选项的条件 })array.findLast((项)>{return 筛选项的条件 }) 三、区别 find方法是从数组头部往后检测&#xff…

AwesomeTechnologyWeekly值的关注的中文社区优质技术周刊一览

作为开发者&#xff0c;我们每天都需要吸收大量的信息补充我们的知识体系. Awesome Technology Weekly Zh-Hans 项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊&#xff0c;定时刷新获取最新一期中文技术月/周/日刊进行展示. 访问网站开始关注吧~&#xff1a;ht…

自动驾驶感知面试-coding应用题

感知面试手撕代码&#xff1a;这个博主总结的很好&#xff0c;尤其是关于叉积的计算 双线性插值 双线性插值公式记忆方法和Python实现 NMS算法 #include<iostream> #include<vector> #include<algorithm>using namespace std; struct Box {int x1,x2,y1,…

【仿真基本功】【PyTorch】从头安装PyTorch(GPU版本)【2024/03/03更新】

【仿真基本功】【PyTorch】从头安装PyTorch&#xff08;GPU版本&#xff09;【2024/03/03更新】 安装步骤1. 安装Anaconda2. 查看显卡对CUDA版本的支持3. 查看PyTorch的安装需求4. 安装PyTorcha) 配置新环境b) 进入新环境c) 按照CUDA版本要求&#xff0c;必须小于等于显卡支持的…

Linux系统——Tomcat优化

目录 一、JVM组成 1.JVM的组成及详解 2.内存的由来 3.虚拟机 3.1 Garbage 垃圾确定方法 3.2垃圾回收基本算法 3.2.1标记-清除 Mark-Sweep 3.2.2标记压缩&#xff08;压实&#xff09;Mark-Compact 3.2.3复制 Copying 3.2.4 多种算法总结 3.2.5拓展——STW 4.分代堆…

C语言-------指针进阶(2)

1.指针数组 指针数组表较简单&#xff0c;类比整型数组&#xff0c;字符数组&#xff0c;整型数组里面的元素都是整型变量&#xff0c;字符数组里面 的元素是字符类型&#xff0c;那么指针数组就是数组里面的每个元素都是指针类型&#xff0c;例如int*arr[5]就是一个 指针数…

数字化转型导师坚鹏:金融机构数字化营销方法和案例研究

金融机构数字化营销方法和案例研究 课程背景&#xff1a; 很多金融控股集团存在以下问题&#xff1a; 不清楚金融机构数字化营销方法&#xff1f;&#xff08;以证券、保险、租赁行业为例&#xff09; 不清楚金融机构数字化营销案例&#xff1f;&#xff08;以证券、保险…