指针的学习2

news2024/12/23 9:26:30

目录

数组名的理解

使用指针访问数组

一维数组传参的本质

冒泡排序

二级指针

指针数组

指针数组模拟二维数组


数组名的理解

数组名是数组首元素的地址

例外:

sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("arr      =%p\n", arr);
	printf("arr+1    =%p\n", arr + 1);
	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);
	return 0;
}

运行结果:

使用指针访问数组

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

[ ]下标引用操作符  arr[ i ]=i [arr]

数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系)

指针(变量)就是指针(变量),是一个变量(4/8个字节)

一维数组传参的本质

先看一段代码:

//数组传参的时候,形参是可以写成数组形式的,但本质还是指针变量
void Print(int arr[10])//int* arr
{
	int sz = sizeof(arr) / sizeof(arr[0]);//4/4=1  得不到元素个数
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	Print(arr);//arr 数组名就是数组首元素地址
	return 0;
}

运行结果:

数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组;形参的数组是不会再单独创建数组空间的,所以形参的数组是可以省略掉数组的大小的

下面这段代码是真正传递整个数组的:

void Print(int* p, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Print(arr,sz);//arr 数组名就是数组首元素地址
	return 0;
}

一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式

冒泡排序

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

void bubble_sort(int arr[], int sz)
{
	int i = 0, j = 0;
	for (i = 0; i < sz; i++)//趟数
	{
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
void Print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	Print_arr(arr, sz);
	return 0;
}

在这段代码中,如果针对于接近排好序的序列,是比较浪费时间的,下面对这段代码进行优化:

void bubble_sort(int arr[], int sz)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < sz; i++)//趟数
	{
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])//相邻交换
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = 0;
			}
		}
		if (flag == 1)//第i趟是有序的,直接跳出
		{
			break;
		}
	}
}
void Print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	Print_arr(arr, sz);
	return 0;
}

二级指针

int main()
{
	int a = 10;
	int* p = &a;//p是一级指针
	int** pp = &p;//pp是二级指针,类型是int**
	printf("%p\n", p);
	printf("%p\n", pp);
	return 0;
}

int**pp=&p;

int*(前面的)说明pp指向的p的类型是int*类型;*(后面的)说明pp是指针变量

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	printf("%p\n", *pp);//p
	printf("%p\n", &a);
	printf("%d\n", **pp);//a=10
	return 0;
}

运行结果:

指针数组

存放指针的数组,指针数组的每个元素都是用来存放地址(指针)的

指针数组模拟二维数组

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 };//指针数组
	int i = 0, j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

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

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

相关文章

EasyCVR智能视频监控平台云台降低延迟小tips

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

彻底学会系列:一、机器学习之线性回归

1.基本概念 线性回归&#xff1a; 有监督学习的一种算法。主要关注多个因变量和一个目标变量之间的关系。 因变量&#xff1a; 影响目标变量的因素&#xff1a; X 1 , X 2 . . . X_1, X_2... X1​,X2​... &#xff0c;连续值或离散值。 目标变量&#xff1a; 需要预测的值: t…

智慧未来已至:人工智能与数字孪生共筑城市新纪元

随着科技的飞速发展&#xff0c;人工智能与数字孪生技术正逐步成为智慧城市建设的核心驱动力。 这两项技术的结合&#xff0c;不仅将彻底改变城市的传统面貌&#xff0c;更将引领我们走向一个更加高效、便捷、绿色的未来。 一、智慧城市的新内涵 智慧城市&#xff0c;是指在城…

DDoS攻击:分布式拒绝服务攻击的威胁与对策

DDoS攻击&#xff1a;分布式拒绝服务攻击的威胁与对策 随着互联网的快速发展&#xff0c;网络安全威胁也在不断增加。其中&#xff0c;分布式拒绝服务攻击&#xff08;DDoS&#xff09;是一种常见且具有破坏性的攻击方式&#xff0c;给个人用户、企业和组织的网络基础设施带来了…

爬虫工作量由小到大的思维转变---<第四十五章 Scrapyd 关于gerapy遇到问题>

前言: 本章主要是解决一些gerapy遇到的问题,会持续更新这篇! 正文: 问题1: 1400 - build.py - gerapy.server.core.build - 78 - build - error occurred (1, [E:\\项目文件名\\venv\\Scripts\\python.exe, setup.py, clean, -a, bdist_uberegg, -d, C:\\Users\\Administrat…

React进阶 - 15(React 中 ref 的使用)

本章内容 目录 一、e.target 获取事件对应“元素”的DOM节点二、ref三、ref 和 setState 合用 上一节我们了解了 React中的”虚拟DOM“中的”Diff算法““ &#xff0c;本节我们来说一说 React中 ref的使用 一、e.target 获取事件对应“元素”的DOM节点 打开之前工程中的 To…

elasticsearch重置密码操作

安装es的时候需要测试这个url&#xff1a;http://127.0.0.1:9200/ 出现弹窗让我输入账号和密码。我第一次登录&#xff0c;没有设置过账号和密码&#xff0c; 解决方法是&#xff1a;在es的bin目录下打开cmd窗口&#xff0c;敲命令&#xff1a;.\elasticsearch-reset-password…

给mysql设置时区

每次重启MySQL服务器后&#xff0c;使用IDEA的database navigator连接都会出现这种情况 解决方式就是 命令行登录后 set global time_zone 8:00;嘿嘿把之前自家简书文章 给mysql设置时区 搬运过来了&#xff0c;方便查阅

Zookeeper相关面试准备问题

Zookeeper介绍 Zookeeper从设计模式角度来理解&#xff0c;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生了变化&#xff0c;Zookeeper就负责通知已经在Zoo…

【lesson37】自己设计用户级缓冲区

文章目录 自己设计用户级缓冲区简易MyFILE_的结构fopen_的实现fputs_的实现fclose_的实现fflush_的实现 完整版代码 自己设计用户级缓冲区 因为用户缓冲区在FILE中&#xff0c;所以我们直接模仿C语言提供的文件操作接口&#xff0c;顺便实现缓冲区。 使用文件系统的框架&#…

C++ 图(三十八)【第四篇】

接下来&#xff0c;我们先学习一个概念&#xff0c;带有权值的图&#xff0c;其实就是每条边上有一个自己独立的值了&#xff0c;接下来我们来进行一个深入的了解吧。 1.带权值得的图的概念 在前面的课程中&#xff0c;图中的边都只是用来表示两个点之间是否存在关系&#xff…

SQL注入其他方法

此次实验因为环境问题很多无法复现&#xff0c;在此只讨论过程和方法 一、SQL注入之outfile注入 mysql的outfile的作用是导出文件&#xff0c;使用此方法的必要条件&#xff1a;&#xff08;此方法成功率极低&#xff09; 1、知道目标网站的物理路径&#xff1b; 2、%secur…

Python算法题集_螺旋矩阵

Python算法题集_螺旋矩阵 题目54&#xff1a;螺旋矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【检测4个方向】2) 改进版一【检测2个方向】3) 改进版二【可读性改进】 4. 最优算法 题目54&#xff1a;螺旋矩阵 本文为Python算法题集之一…

《Pandas 简易速速上手小册》第9章:Pandas 数据可视化(2024 最新版)

文章目录 9.1 Pandas 内置可视化工具9.1.1 基础知识9.1.2 重点案例&#xff1a;销售数据分析9.1.3 拓展案例一&#xff1a;产品评价统计9.1.4 拓展案例二&#xff1a;员工满意度分布 9.2 与 Matplotlib 和 Seaborn 集成9.2.1 基础知识9.2.2 重点案例&#xff1a;销售趋势分析9.…

「递归算法」:验证二叉搜索树

一、题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff…

vulhub中Apache APISIX 默认密钥漏洞复现(CVE-2020-13945)

Apache APISIX是一个高性能API网关。在用户未指定管理员Token或使用了默认配置文件的情况下&#xff0c;Apache APISIX将使用默认的管理员Token edd1c9f034335f136f87ad84b625c8f1&#xff0c;攻击者利用这个Token可以访问到管理员接口&#xff0c;进而通过script参数来插入任意…

110.乐理基础-五线谱-五线谱的速度

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的附点、休止符、连线、延音线-CSDN博客 上一个内容里练习的答案&#xff1a; 五线谱里的情绪与速度也是跟简谱里一样&#xff0c;详情看&#xff1a;音乐的速度 专栏里的内容&#xff0c;根据创建时间&…

CNN应用Keras Tuner寻找最佳Hidden Layers层数和神经元数量

介绍&#xff1a; Keras Tuner是一种用于优化Keras模型超参数的开源Python库。它允许您通过自动化搜索算法来寻找最佳的超参数组合&#xff0c;以提高模型的性能。Keras Tuner提供了一系列内置的超参数搜索算法&#xff0c;如随机搜索、网格搜索、贝叶斯优化等。它还支持自定义…

《Python 网络爬虫简易速速上手小册》第2章:网络爬虫准备工作(2024 最新版)

文章目录 2.1 选择合适的爬虫工具和库2.1.1 重点基础知识讲解2.1.2 重点案例&#xff1a;使用 Scrapy 抓取电商网站2.1.3 拓展案例 1&#xff1a;使用 Requests 和 BeautifulSoup 抓取博客文章2.1.4 拓展案例 2&#xff1a;使用 Selenium 抓取动态内容 2.2 设置开发环境2.2.1 重…

计算机毕业设计 | vue+SpringBoot图书借阅管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着现在科学技术的进步&#xff0c;人类社会正逐渐走向信息化&#xff0c;图书馆拥有丰富的文献信息资源&#xff0c;是社会系统的重要组成部分&#xff0c;在信息社会中作用越来越重要&#xff0c;在我国图书馆计算机等 信息技术的应用起步…