第十讲:指针(2)

第十讲:指针(2)

  • 1.对于数组名的理解
    • 1.1验证数组名就是数组首元素的地址
    • 1.2sizeof数组名和&数组名
      • 1.2.1sizeof数组名
      • 1.2.2&数组名
  • 2.使用指针访问数组
  • 3.数组传参的本质
  • 4.冒泡排序
  • 5.二级指针
  • 6.指针数组
  • 7.指针数组模拟二维数组

这一讲讲的是指针与数组之间的关系

1.对于数组名的理解

先说明结论:数组名就是数组首元素的地址,但是在使用sizeof数组名和&数组名时是个例外

1.1验证数组名就是数组首元素的地址

在这里插入图片描述
对于上面的代码,结果如下:
在这里插入图片描述
可以看出&arr[0]的结果和arr的地址相同,其实&arr[0]和arr的效果是相同的

1.2sizeof数组名和&数组名

结论:sizeof数组名和&数组名都是针对整个数组进行处理的

1.2.1sizeof数组名

在这里插入图片描述
在x64的环境下,一个int类型的整形占4个字节,所以用sizeof计算得到的结果为4 * 9 = 36,此时,就不难发现:sizeof数组名计算的是整个数组的大小,单位是字节

1.2.2&数组名

在这里插入图片描述
上述代码的结果为:
在这里插入图片描述
我们可以发现,在x86的环境下:
arr+1的地址和arr的地址相差4
&arr+1的地址和&arr的地址相差8C - 68 = 24,这个24指的是十六进制,转换成十进制就是36,而这个数组的大小刚好就是36,所以我们可以知道:这里的数组名表示的是整个数组,取出的是整个数组的地址,其实它就相当于int (*arr)[9]

2.使用指针访问数组

结论:
p[i] == (p+i)
数组元素在进行访问时,即使以p[i]形式写入,编译器在进行编译时,也会将p[i]形式转换成
(p+i)形式进行访问的

使用指针访问数组的使用:


//2.使用指针访问数组
int main()
{
	int arr[9] = { 0 };

	int i = 0;

	//对数组元素进行输入
	for (i = 0; i < 9; i++)
	{
		//scanf("%d", &arr[i]);  //这个写法和下面的写法的作用是相同的
		scanf("%d", arr+i);
	}

	//对数组元素进行打印
	for (i = 0; i < 9; i++)
	{
		//printf("%d ", arr[i]);  //这个写法和下面的写法的作用是相同的
		printf("%d ", *(arr + i));
	}
	return 0;
}

3.数组传参的本质

总结:
数组传参的本质是传入了数组首元素的地址

在这里插入图片描述
这串代码的结果为:
在这里插入图片描述
结果呈现的原因如下:数组传参的本质是传入了数组首元素的地址,而在X86的环境下,一个指针类型的变量的大小为4个字节,也就是说sizeof(arr) = 4,而sizeof(arr[0])的大小为一个整形的大小,也是4,所以两个值相比就是1

4.冒泡排序

冒泡排序的核心思想:相邻两个元素进行比较

//冒泡排序(进行逆序排序)

//方法1
void BubbleSort1(int* pa, int sz)                 //这个冒泡排序会稍微浪费时间,因为不管数组是怎么样的数组
{                                                //这个冒泡排序都会进行大小比较,如果这个数组一开始已经是
	int count = 0;                               //我们需要的数组的话,还是会进行排序
	for (int i = 0; i < sz - 1; i++)             //此时count恒等于45
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (*(pa + j) < *(pa + j + 1))
			{
				int temp = *(pa+j);
				*(pa + j) = *(pa + j + 1);
				*(pa + j + 1) = temp;
			}
			count++;
		}
	}
	printf("%d\n", count);
}


//优化
void BubbleSort(int* pa, int sz)                 
{                                                
	int flag = 1; //假设一开始就是需要的数组
	int count = 0;
	for (int i = 0; i < sz - 1; i++)             
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (*(pa + j) < *(pa + j + 1))
			{
				flag = 0; //如果进行排序了的话,flag就变成0,认为还需要排序
				int temp = *(pa + j);
				*(pa + j) = *(pa + j + 1);
				*(pa + j + 1) = temp;
			}
			count++;      //这时count应该小于等于45
		}
		if (flag)  //如果一轮排序进行完,没有进行排序动作,就说明这个数组就是一开始需要的数组
			break; //所以就不用再次排序
		flag = 1; //排序进行一组,再次认为这个数组已经排序好了
	}
	printf("%d\n", count);
}


int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };

	int sz = sizeof(arr) / sizeof(arr[0]);

	//冒泡排序
	BubbleSort(arr, sz);

	//打印
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

5.二级指针

指针变量也是变量,那么指针变量的地址就可以用二级指针来存储,关系如图所示:
在这里插入图片描述
对于二级指针的运算有:


int main()
{
	int a = 0;
	int* pa = &a;
	int** ppa = &pa;


	int b = 10;
	*ppa = &b; //*ppa得到的是pa
	           //相当于pa = &b
	**ppa = 30;//等价于*pa = 30,也就是b = 30
	return 0;
}

6.指针数组

总结:
类比于整型数组(存放整形的数组)、字符数组(存放字符的数组)
指针数组就是存放指针的数组,本质上还是数组

在这里插入图片描述
在这里插入图片描述
指针数组的每个元素都是指针,也可以指向一片区域

7.指针数组模拟二维数组


//指针数组模拟二维数组
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* arr[] = { arr1, arr2, arr3 };  //使用arr数组存放上面三个数组的首元素地址

	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);  //此时的arr[i]代表访问arr[]数组的元素arr[i]指向了整形的一维数组
		}                              //arr[i][j]就表示一维数组中的元素
		printf("\n");      //但是这个方法并不是真正的二维数组,因为每一行并不是连续存储的
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TODESK怎么查看有人在远程访问

odesk怎么查看有人在远程访问 Todesk作为一款远程桌面控制软件&#xff0c;为用户提供了便捷的远程访问与控制功能。但在享受这种便利的同时&#xff0c;许多用户也关心如何确保自己设备的安全&#xff0c;特别是如何知道是否有人在未经授权的情况下远程访问自己的电脑。本文将…

TODESK远程开机的原理

在现代计算机技术飞速发展的背景下&#xff0c;远程控制软件成为我们日常工作中不可或缺的工具。其中&#xff0c;ToDesk作为一款高效且易用的远程控制软件&#xff0c;备受用户青睐。那么&#xff0c;ToDesk远程开机的原理是什么呢&#xff1f;本文将为你揭晓这个秘密。 KKVie…

《TAM》论文笔记(上)

原文链接 [2005.06803] TAM: Temporal Adaptive Module for Video Recognition (arxiv.org) 原文代码 GitHub - liu-zhy/temporal-adaptive-module: TAM: Temporal Adaptive Module for Video Recognition 原文笔记 What&#xff1a; TAM: Temporal Adaptive Module for …

Disk Doctor for Mac 免激活版:数据安全守卫者

数据丢失是每个人都可能遇到的问题&#xff0c;但Disk Doctor for Mac能让这个问题迎刃而解。这款强大的数据恢复软件&#xff0c;能迅速找回因各种原因丢失的数据。 Disk Doctor采用先进的扫描技术&#xff0c;能深入剖析磁盘&#xff0c;找到并恢复被删除或损坏的文件。同时&…

NREL概述了串联电池的前进方向

研究人员表示&#xff0c;串联技术将帮助我们在2050年达到75太瓦的光伏发电量&#xff0c;但行业合作将是关键 美国能源部国家可再生能源实验室&#xff08;NREL&#xff09;的研究人员已经制定了一份路线图&#xff0c;说明如何将串联太阳能电池&#xff08;特别是那些结合了不…

吉林事业编报名照要求<50kb怎么压缩

吉林事业编报名照要求&#xff1c;50kb怎么压缩

如何安装ElasticSearch及相关件

一、简介 ElasticSearch是什么&#xff1f; elasticsearch简写es&#xff0c;es是一个高扩展、开源的全文检索和分析引擎&#xff0c;它可以准实时地快速存储、搜索、分析海量的数据。 ElasticSearch 插件 elasticsearch-head是一款专门针对于elasticsearch的客户端工具&am…

基于FPGA的视频矩阵切换方案

一、单个显示设备的系统方案&#xff1a;会议室只有1个显示设备 会议室的信号源有很多&#xff0c;但是显示设备只有1个&#xff0c;这个时候最佳方案是使用切换器。 &#xff08;1&#xff09;切换器&#xff08;控制方式&#xff1a;遥控器、软件、机箱面板、中控&#xff…

Relaxed MemoryConsistency

SC和TSO都被称之为强&#xff08;strong&#xff09;保序模型&#xff1b; because the global memory order of each model usually respects (preserves) per-thread program order&#xff1b;回想一下&#xff0c;对于load和store的所有四种组合&#xff08;Load -> Lo…

FPGA+HDMI转换方案,用于网络直播切换直播画面,客户应用:直播,自媒体

FPGAHDMI转换方案&#xff0c;用于网络直播切换直播画面 客户应用:直播&#xff0c;自媒体 主要功能: 1.支持多路HDMI高清输入/输出 2.支持各路输入输出灵活切换 3.支持USB接口 4.支持网口 5.支持音频输出接口 6.支持serders

使用nvm安装node.js过程

今天Jade尝试安装nvm&#xff0c;并使用命令安装node.js但是碰到了一些问题&#xff0c;在此作为学习记录分享出来。希望可以留下深刻的印象&#xff1a; 1、概念了解 nvm----- (Node.js version manager)是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载…

Flask SQLAlchemy 技术指南

文章目录 什么是 Flask SQLAlchemy&#xff1f;安装 Flask SQLAlchemy创建 Flask 应用和数据库模型添加和查询数据运行 Flask 应用总结**数据库迁移&#xff08;Database Migrations&#xff09;****复杂查询****关系模型****事务处理****性能优化****安全性****扩展功能** Fla…

AWS Lambda 第一个例子Hello (JAVA)

什么是Serverless&#xff08;无服务器计算&#xff09; 行业通常所说的Serverless&#xff0c;主要是指“无服务器计算&#xff08;Serverless Computing&#xff09;”。无服务器计算&#xff0c;并不是真的不需要服务器&#xff0c;而是说&#xff0c;对于用户&#xff0c;…

基于鸢尾花数据集实施自组织神经网络聚类分析

基于鸢尾花数据集实施自组织神经网络聚类分析 1. 自组织神经网络的基础知识2. 鸢尾花数据集的自组织分类3. SOM的无监督聚类 1. 自组织神经网络的基础知识 自组织神经网络也称自组织映射&#xff08;SOM&#xff09;或自组织特征映射&#xff08;SOFM&#xff09;&#xff0c;…

基于vs和C#的WPF应用之动画3

注&#xff1a;1、在内部和外部使用缓动函数 <Grid.Resources> <PowerEase x:Key"powerease" Power"3" EasingMode"EaseInOut"/> </Grid.Resources> <DoubleAnimation EasingFunction"{StaticResource powerease}&quo…

机器学习各个算法的优缺点!(下篇) 建议收藏。

上篇地址&#xff1a;机器学习各个算法的优缺点&#xff01;&#xff08;上篇&#xff09; 建议收藏。-CSDN博客 直接进入主题。 目录 6.降维算法 7.聚类算法 8.贝叶斯算法 9.人工神经网络 10.深度学习 谢谢观看。 6.降维算法 降维算法是一类用于减少数据维度的技术。 …

python实现背单词程序

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 背单词是学习英语的一个重要环节,它有很多好处,以下是其中一些主要的好处: 提高词汇量

探索无界知识:用 ChatGPT 的原理学习任何事物!

为避免文章重复&#xff0c;您的文本已通过更改句式、用词以及句子结构进行了修改。现在的文本应该能更好地满足去重的需求&#xff1a; 从ChatGPT原理出发&#xff0c;我们探讨GPT如何启发人类学习和构建个人知识体系。 1. 明确学习目标 机器学习必须依靠目标函数。同样&…

VSCode(安装)

前言 VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git …

Python | Leetcode Python题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicates(self, nums: List[int]) -> int:idx, left, right 0, 0, 0while left < len(nums):nums[idx] nums[left]idx 1while right < len(nums) and nums[right] nums[left]:right 1if right - …