指针及其应用

1.定义

指针:也是一个变量,存放所指变量的地址,根据变量定义的不同,指针指向的类型也不同
注意:*是与前面类型一体的

int main(void)
{
	int* p;  //等价于int *p;
	//为了区分变量,C语言中一般将*放置于变量名前面
	int* p,p1;  //p是指向int类型的指针,p1是指向int类型的普通变量
	
	//上面语句等价下面语句,仅仅是下面语句看着更易区分
	
	int *p,p1;  //p是指向int类型的指针,p1是指向int类型的普通变量

	return 0;
}

2.初始化

//指针的初始化
//1.第一种初始化
int main(void)
{
	int a = 0x66;
	int *p;  //定义一个指向int的指针p
	p = &a;   //指针指向a的地址
	return 0;
}
//2.第二种初始化
int main(void)
{
	int a = 0x66;
	int *p = &a;
	return 0;
}

使用指针:
*p相当于解引用,去找指针存储的地址,根据地址去找对应的数据。

操作方式举例解释
取地址p = &a;将数据a的首地址赋值给p
取内容*p;取出指针指向的数据单元
p++; 或者 p =p+5;指针向下移动一个数据宽度/指针向下移动5个数据宽度(地址增大)
p–; 或者 p =p-5;指针向上移动一个数据宽度/指针向上移动5个数据宽度(地址减小)

3.数组与指针

  • 数组即相同数据类型变量的集合,数据名即为指向该数据类型的指针。
  • 数组的定义等效于申请内存、定义指针和初始化
int main()
{
	char a[] = { 0x34, 0x35, 0x36 };
	char *p;
	p = a;  //a为数组的首地址,相当于也是一个指针
	printf("%x\n", a[0]);
	printf("%x\n", a[1]);
	printf("%x\n", a[2]);

	//利用指针解引用
	printf("*p为%x\n", *p);
	printf("*(p+1)为%x\n", *(p+1));
	printf("*(p+2)为%x\n", *(p + 2));

	return 0;
}

在这里插入图片描述

4.指针应用

  1. 传递参数
    (1)使用指针传递大容量的参数,主函数和子函数使用的是同一套数据,避免参数传递过程中的数据复制,提高运行效率,减少内存占用(即为了不开辟一块大的空间地址,减少内存的使用)
    == 需要理清值传递与址传递的区别:==
值传递址传递
函数调用后,实参的值不会发生改变函数调用后,实参的值会发生改变
形参会开辟与实参相同大小空间的内存形参与实参公用一段内存空间
隔离数据,安全数据公用,已造成数据的丢失与差错

使用址传递,形参和实参公用一段内存,当形参改变数值时,实参的值也会发生变化,为了防止出现这种情况,一般在函数调用前加const,只允许对参数进行读,不可以修改。

//加上const,只允许数组被读,不允许修改
int FindMax(const int* arr[], int Count)
{
	int Max = arr[0];
	for (int i = 1; i < Count; i++)
	{
		if (arr[i] > Max)
		{
			Max = arr[i];
		}
	}
	return Max;
}
int main(void)
{
	int a[] = { 3, 5, 7, 1, 9 };
	int max = 0;
	max = FindMax(a, sizeof(a) / sizeof(a[0]));
	printf("max为%d\n", max);
	return 0;
}

在这里插入图片描述
(2)使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计
例子:返回数组最大值及其出现的次数,利用指针有两个返回值

//找出最大值并返回最大值及其出现的次数
//*max与*Count分别与主函数里面的Max和Count共用一段地址
void FindMaxCount(int *max, int *Count, const int *arr, int length)
{
	*max = arr[0];
	*Count = 1;
	for (int i = 1; i < length; i++)
	{
		if (*max < arr[i])
		{
			*max = arr[i];  //更新最大值
			*Count = 1;   //并将Count置为1
		}
		else if (*max == arr[i])
		{
			(*Count)++;
		}
	}
}
int main(void)
{
	int a[] = { 9, 100, 24, 56, 77, 99, 100 };
	int Max;   //找最大值
	int Count;  //最大值出现的次数
	FindMaxCount(&Max, &Count, a, sizeof(a)/sizeof(a[0]));
	printf("Max为%d,Count为%d\n", Max, Count);
	return 0;
}

在这里插入图片描述

  1. 传递返回值
  • 将模块内的共有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作

句柄:类似于把手,有了把手,就可操作程序。在这里插入图片描述
3. 直接访问物理地址下的数据
(1)访问硬件指定内存下的数据,如设备ID号等
(2)将复杂格式的数据转换为字节,方便通信与存储

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

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

相关文章

Flink(十三)【Flink SQL(上)】

前言 最近在假期实训&#xff0c;但是实在水的不行&#xff0c;三天要学完SSM&#xff0c;实在一言难尽&#xff0c;浪费那时间干什么呢。SSM 之前学了一半&#xff0c;等后面忙完了&#xff0c;再去好好重学一遍&#xff0c;毕竟这玩意真是面试必会的东西。 今天开始学习 Flin…

数据结构学习 jz30 包含 min 函数的栈

关键词&#xff1a;排序 题目&#xff1a;最小栈 方法一&#xff1a;在记录这个数的同时&#xff0c;记录目前的最小值。看了提示才写出来的。 方法二&#xff1a;辅助栈。辅助栈保持非严格递减。看了k神的答案。 方法一&#xff1a; 一开始没想到怎么存最小&#xff0c;看…

从零实现一套低代码(保姆级教程)【后端服务】 --- 【16】初始化后端项目

摘要 在前面的实现过程中&#xff0c;我们的低代码平台&#xff0c;在前端已经有一定的构建页面的能力了。 但是对于我们实现一个平台&#xff0c;肯定要支持用户对页面进行保存等功能&#xff0c;包括后面我们运行时的设计&#xff0c;都要依赖于后端的能力 所以&#xff0c…

运维必存的20个常见的故障排查、修复大全

你们好&#xff0c;我的网工朋友。 “稳定是偶然&#xff0c;异常才是常态”。这句话用来形容运维的工作再合适不过了 对于运维来说&#xff0c;工作最常遇到的就是不稳定性带来的各种故障&#xff0c;经常围绕发现故障、响应故障、定位故障、恢复故障这四大步骤打转。 为此…

一篇文章带你搞懂多线程面试相关的一些问题

目录 1.Callable接口 1.1使用Callable接口来创建线程 1.1相关面试题&#xff1a; 介绍下 Callable 是什么 2.JUC常见的类&#xff08;java.util,concurrent) 2.1ReentrantLock ReentrantLock和sychronized的区别 3.信号量 4.CountDownLatch 5.线程安全的集合类 5.1多线…

Flink-容错机制

Flink中的容错机制 流式数据连续不断地到来&#xff0c;无休无止&#xff1b;所以流处理程序也是持续运行的&#xff0c;并没有一个明确的结束退出时间。机器运行程序&#xff0c;996 起来当然比人要容易得多&#xff0c;不过希望“永远运行”也是不切实际的。因为各种硬件软件…

ioDraw在线图表工具 - 轻松制作专业图表,只需3步!

还在花大量时间手动画图表&#xff1f;还在为图表样式而烦恼&#xff1f;ioDraw为你提供一站式解决方案&#xff01;ioDraw在线图表工具实现了AI自动生成图表&#xff0c;让你轻松制作专业图表&#xff0c;只需3步&#xff01; 1. 录入数据 只需将你的数据告诉ioDraw AI助手&…

alibaba.item_get API:电商行业中的数据驱动决策支持

alibaba.item_get API 是阿里巴巴提供的一个用于获取商品详情的接口。在电商行业中&#xff0c;数据驱动的决策支持是非常重要的&#xff0c;而这个 API 可以帮助你获取到商品的各种详细信息&#xff0c;从而为你的决策提供支持。 具体来说&#xff0c;通过使用 alibaba.item_…

【Oracle】期末复习题

目录 一. 单选题&#xff08;共164 题&#xff09; 二. 多选题&#xff08;共14 题&#xff09; 三. 填空题&#xff08;共4 题&#xff09; 四. 分析题&#xff08;共五题&#xff09; 一&#xff09;考生子系统 三&#xff09;考试存储方案 四&#xff09;铁路12306 …

条款24:若所有参数皆需类型转换,请为此采用非成员函数

设计一个表示有理数的类时&#xff0c;允许从整数隐式转换为有理数是有用的&#xff1a; class Rational { public:Rational(int numerator 0, // 该构造函数没有explicit限制;int denominator 1); int numerator() const; int denominator() const; const Rational opera…

CAS的超~详细介绍

什么是CAS CAS全称Compare and swap,是一种比较特殊的CPU指令. 字面意思:"比较并交换", 一个CAS涉及到以下操作: 我们假设内存中的原数据为V,旧的预期值A,需要修改的新值B. 1.比较A和V是否相等(比较) 2.如果相等,将B写入V.(交换) 3.返回操作是否成功. 伪代码 下面…

基于位的权限系统

基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中&#xff0c;不同的权限被编码为2的幂次方 (例如1、2、4、8等)&#xff0c;每个权限对应一个独立的二进制位&#xff08;可想而知运算速度是非常快的&#xff09;。通过将这些权限值组合在一起形成一个…

day13 滑动窗口最大值 前K个高频元素

题目1&#xff1a;239 滑动窗口最大值 题目链接&#xff1a;239 滑动窗口最大值 题意 长度为K的滑动窗口从整数数组的最左侧移动到最右侧&#xff0c;每次只移动1位&#xff0c;求滑动窗口中的最大值 不能使用优先级队列&#xff0c;如果使用大顶堆&#xff0c;最终要pop的…

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例&#xff0c;记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有&#xff1a;Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

Java SE入门及基础(15)

Java 中的标号&#xff08;标签 label&#xff09; 1. 语法规则 标号名称 : 循环结构 2. 作用 标号的作用就是给代码添加一个标记&#xff0c;方便后面使用。通常应用在循环结构中&#xff0c;与break 语句配合使用 3. 应用场景 有如下菜单&#xff1a; 实现其中返回主菜…

C++ | 四、指针、链表

指针 指针用来储存地址定义方式&#xff0c;int *ptr;&#xff0c;使用*来表示所定义的变量是指针取地址符&#xff0c;ptr &a;&#xff0c;通过&来取得一个普通变量的地址&#xff0c;并储存到指针中取值&#xff08;解引用&#xff09;&#xff0c;想要取得一个指针…

qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

系统环境&#xff1a;Win10家庭中文版 Qt : 5.12.9 链接了一些64位的第三方库&#xff0c;程序编译完运行后出现 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 弹窗如下&#xff1a; 网上搜了一些都是关于pyQt的&#xff0c…

C++刷题 -- 栈和队列

C刷题 – 栈和队列 文章目录 C刷题 -- 栈和队列1.用栈实现队列2.用队列实现栈3.有效的括号4.前 K 个高频元素 1.用栈实现队列 力扣链接 一个栈自然实现不了队列功能&#xff0c;需要使用两个栈一个输入栈&#xff0c;一个输出栈队列是先入先出&#xff0c;当队列push操作&…

外包干了4年,废了···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0…

专业、高效的解决方案:为企业业务提供强大支持

随着市场竞争的日益激烈&#xff0c;企业要想在众多竞争对手中脱颖而出&#xff0c;必须具备强大的核心竞争力。而这种竞争力的源泉&#xff0c;往往来自于企业所提供的产品和服务。为了确保产品和服务的质量&#xff0c;企业需要不断地进行技术创新和管理创新&#xff0c;以满…