C++基础入门丨7. 指针——一文搞懂指针

news2024/9/21 11:06:15

操作系统:Windows 10
IDE:Visual Studio 2019

文章目录

    • 1 什么是指针
    • 2 指针变量的定义和使用
    • 3 指针所占用的空间
    • 4 空指针和野指针
    • 5 const修饰指针
    • 6 指针和数组
    • 7 指针和函数
    • 8 指针、函数、数组

1 什么是指针

我们知道每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。

而指针就是用来保存地址的工具,可以利用指针变量保存地址,进而通过指针间接访问变量的内存。

2 指针变量的定义和使用

定义语法:数据类型 * 变量名;,例如:int * p;

指针的使用:*p,通过*操作指针变量指向的内存。

指针变量和普通变量的区别

  • 普通变量存放的是数据,指针变量存放的是地址。
  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用。
#include<iostream>
using namespace std;

int main() {

	//1、指针的定义
	int a = 10; //定义整型变量a
	
	//指针定义语法: 数据类型 * 变量名 ;
	int * p;

	//指针变量赋值
	p = &a; //指针指向变量a的地址
	cout << &a << endl; //打印数据a的地址
	cout << p << endl;  //打印指针变量p

	//2、指针的使用
	//通过*操作指针变量指向的内存
	cout << "*p = " << *p << endl;

	system("pause");

	return 0;
}

3 指针所占用的空间

  • 所有指针类型在32位操作系统下是4个字节
  • 所有指针类型在64位操作系统下是8个字节
#include<iostream>
using namespace std;

int main() {

	int a = 10;

	int* p;
	p = &a; //指针指向数据a的地址

	cout << *p << endl; //* 解引用
	cout << sizeof(p) << endl;
	cout << sizeof(char*) << endl;
	cout << sizeof(float*) << endl;
	cout << sizeof(double*) << endl;

	system("pause");

	return 0;
}

在这里插入图片描述

4 空指针和野指针

指针类型解释举例
空指针指针变量指向内存中编号为0的空间int * p = NULL;
野指针指针变量指向非法的内存空间int * p = (int *)0x1100;
  • int * p = (int *)0x1100; 指针变量p指向内存地址编号为0x1100的空间,但是这个空间在此之前没有申请。
  • 空指针和野指针都不是我们申请的空间,因此不要访问。

5 const修饰指针

三种情况习惯叫法举例
const修饰指针常量指针const int * p
const修饰常量指针常量int * const p
const即修饰指针,又修饰常量-const int * const p
  • 常量指针:const修饰的是指针,指针指向可以改,指针指向的值不可以更改。
const int * p1 = &a; 
p1 = &b; //正确
//*p1 = 100;  报错
  • 指针常量:const修饰的是常量,指针指向不可以改,指针指向的值可以更改。
int * const p2 = &a;
//p2 = &b; //错误
*p2 = 100; //正确
  • const即修饰指针,又修饰常量:指针指向和指针指向的值都不可以改。
const int * const p3 = &a;
//p3 = &b; //错误
//*p3 = 100; //错误

指针常量、常量指针 助记:

两种情况形式拆解
指针常量const int ***** pconst (常量)+ *****(指针) → \to 常量指针
常量指针int ***** const p*****(指针) + const(常量) → \to 指针常量

6 指针和数组

作用:利用指针访问数组中元素

#include<iostream>
using namespace std;

int main() {

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

	int* p = arr;  //指向数组的指针

	cout << "第一个元素: " << arr[0] << endl;
	cout << "指针访问第一个元素: " << *p << endl;

	for (int i = 0; i < 10; i++)
	{
		//利用指针遍历数组
		cout << *p << endl;
		p++;
	}

	system("pause");

	return 0;
}

在这里插入图片描述

7 指针和函数

作用:利用指针作函数参数,可以修改实参的值

#include<iostream>
using namespace std;

//值传递
void swap1(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}
//地址传递
void swap2(int* p1, int* p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main() {

	int a = 10;
	int b = 20;
	swap1(a, b); // 值传递不会改变实参

	swap2(&a, &b); //地址传递会改变实参

	cout << "a = " << a << endl;

	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

在这里插入图片描述

8 指针、函数、数组

  • 封装一个函数,利用冒泡排序,实现对整型数组的升序排序。
#include<iostream>
using namespace std;

//1、定义一个数组,数组中的元素可以自由添加
int arr[] = { 3,5,1,7,4,9,0,6,2,8,15,12,14,13,11 };
int len = sizeof(arr) / sizeof(arr[0]);

//2、函数实现冒泡排序,指针变量接收数组
void bubbleSort(int * arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len -i -1; j++)
		{
			if (arr[j] > arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}//3、调用函数,打印排序后的结果
int main()
{
	bubbleSort(arr, len);

	for (int i = 0; i < len; i++)
	{
		cout << arr[i]; cout << " ";
	}

	system("pause");

	return 0;
}

在这里插入图片描述

Reference

  • [1]:https://www.bilibili.com/video/BV1VJ411M7WR

—— END ——


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留言。或者你有更好的想法,欢迎一起交流学习~~~

更多精彩内容请前往 AXYZdong的博客

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

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

相关文章

【ESLint】ESLint的安装配置及vscode插件

一、什么是ESLintESLint是可组装的JavaScript和JSX检查工具。工作中常用&#xff0c;所以最好有所了解。可以在官网中查询相关规则&#xff1a;ESLint - Pluggable JavaScript linter - ESLint中文二、ESLint的安装配置在创建自定义vue项目时&#xff0c;要勾选CSS Pre-process…

SpringCloud 微服务工具集

SpringCloud 微服务工具集 v1.1 微服务架构集大成者&#xff0c;云计算最佳业务实践。 版本: Hoxton SR6 1.什么是微服务 官网: https://www.martinfowler.com/articles/microservices.html In short, the microservice architectural &#xff08;架构&#xff09;style is…

32种EMC标准电路分享-电路接口防护-标准参考电路

30种EMC标准电路01 AC24V接口EMC设计标准电路02 AC110V-220VEMC设计标准电路03 AC380V接口EMC设计标准电路04 AV接口EMC设计标准电路05 CAN接口EMC设计标准电路06 DC12V接口EMC设计标准电路07 DC24V接口EMC设计标准电路08 DC48接口EMC设计标准电路09 DC110V接口EMC设计标准电路…

Blender 物理属性 (四)流体

文章目录流体简介.域.创建域.直接创建.通过物体创建.域的属性.设置.液体&#xff08;域类型为液体时&#xff09;.扩散.网格.气体&#xff08;域类型为气体时&#xff09;.消融.噪波.视图显示.缓存.流.创建水.创建火与烟.流来源.初始速度.渲染火与烟.效果器.流体简介. 1 流体用…

这些好用的办公软件分享给你

软件一&#xff1a;备忘录 现在大部分手机备忘录都提供语音记录功能&#xff0c;可以实时录音并转换成文本内容记录下来&#xff0c;使用起来还是比较方便的&#xff0c;但是要注意它支持转换的时长是有限制的哦&#xff01; 操作步骤&#xff1a;打开手机备忘录&#xff0c;…

【宝塔】【Windows】【Blessing-Skin】【我的世界】用宝塔Windows搭建皮肤站

文章目录前言所需环境相关链接安装宝塔安装步骤访问宝塔同意协议安装环境安装WNMP添加站点开始安装皮肤站配置网站配置Nginx URL重写规则&#xff08;即 伪静态&#xff09;配置PHP安装皮肤站一些小调整安装插件常见问题 - 插件市场严重错误添加认证服务器结尾前言 为什么不用…

数影周报:LOL源代码遭黑客拍卖,阿里杭州西溪全球总部2023年底前全面建成

本周看点&#xff1a;《英雄联盟》游戏源代码遭黑客拍卖&#xff1b;消息称Salesforce 将任命三位新独立董事&#xff1b;2022年下架移动应用程序420款&#xff1b;抖音超市上线&#xff1b;戴尔以约1亿美元收购以色列初创公司Cloudify......数据安全那些事《英雄联盟》游戏源代…

【Pytorch项目实战】之自然语言处理:RNN、LSTM、GRU、Transformer

文章目录自然语言处理算法一&#xff1a;循环神经网络&#xff08;Recurrent Natural Network&#xff0c;RNN&#xff09;算法二&#xff1a;长短时记忆神经网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;算法三&#xff1a;门控循环单元神经网络&#…

基于android的新闻阅读系统

需求信息&#xff1a; 从模块的角度将APP的主要内容划分为登录模块、新闻模块、留言模块、报道模块、关注模块、语音模块这六个功能模块&#xff0c;完成以下功能&#xff1a; &#xff08;1&#xff09;登录模块 当用户打开应用程序后&#xff0c;如果直接登录&#xff0c;由于…

ElasticSearch - DSL查询语法

目录 DSL查询分类 全文检索查询 精确查询 地理查询 复合查询 相关性算分 算分函数查询 BooleanQuery DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有的数据&#x…

Rust库交叉编译以及在Android与iOS中使用

本篇是关于交叉编译Rust库&#xff0c;生成Android和iOS的二进制文件&#xff08;so与a文件&#xff09;&#xff0c;以及简单的集成使用。 1.环境 系统&#xff1a;macOS 13.0 M1 Pro&#xff0c;Windows 10 Python: 3.9.6 Rust: 1.66.1 NDK: 21.4.7075529 这里就不具体说…

收藏贴!新手到底应该购买Salesforce专业版还是企业版?

Salesforce专业版&#xff08;Professional Edition&#xff09;是一个适用于小型企业的工具&#xff0c;它具有完整Salesforce套件的许多功能&#xff0c;但也有一些明显的限制。本篇文章将具体阐明Salesforce专业版是什么&#xff0c;它的优势以及其与企业版&#xff08;Ente…

SQL Server 2008如何创建定期自动备份任务

我们知道&#xff0c;利用SQL Server 2008数据库可以实现数据库的定期自动备份。方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份&#xff0c;下面我们将SQL SERVER 2008定期自动备份的方法分享给大家。 首先需要启动SQL Server Agent服务&#xff0c;这个…

Python实现vlog生成器

Python实现vlog生成器 vlog&#xff0c;全称为Video blog&#xff0c;意为影音博客&#xff0c;也有翻译为微录。 本文将尝试用Python基于Moviepy从一个文本文件中自动生成一个视频格式的vlog&#xff0c;实现的功能如下&#xff1a; 将文件的第一行标题生成视频的片头将文件…

C++——红黑树

目录 红黑树介绍 红黑树实现 节点的插入 完整代码 红黑树介绍 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确…

5 使用pytorch实现线性回归

文章目录前提的python的知识补充基本流程准备数据构造计算图loss以及oprimizer循环训练课程代码课程来源&#xff1a; 链接课程内容参考&#xff1a; 链接以及&#xff08;强烈推荐&#xff09;Birandaの前提的python的知识补充 pytorch 之 call, init,forward pytorch系列nn.…

Python进行因子分析

1 因子分析 1.1 定义 因子分析法(Factor Analysis)是一种利用降维的思想&#xff0c;从研究原始变量相关矩阵内部的依赖关系出发&#xff0c;把一些具有错综复杂关系的变量归结为少数几个综合因子的一种多变量统计分析方法。其优势在于不仅可以在减少大量指标分析的工作量的同…

尚硅谷hello scala-配置idea2022.1.2版本创建scala2.11.8版本maven文件

0_前置说明 软件版本 idea2022.1.2 scala2.11.8 java1.8.0_144 尚硅谷资源下载 关注b站尚硅谷 idea资源 百度网盘&#xff1a;https://pan.baidu.com/s/1Gbavx34OfF29LZqJ8dc85g?pwdyyds 提取码: yyds B站直达&#xff1a;​https://www.bilibili.com/video/BV1CK411d7a…

LabVIEW NI Linux Real-Time深层解析

LabVIEW NI Linux Real-Time深层解析NI LabVIEW Real-Time模块支持NI Linux Real-Time操作系统&#xff0c;在选定的NI硬件上提供。本文介绍了具体的新特性和高级功能&#xff0c;可让您为应用充分利用NI Linux Real-Time。Linux Shell支持NI Linux Real-Time操作系统提供了全面…

《Linux0.11源码趣读》学习笔记day6

到上次记录&#xff0c;整个操作系统的全部代码就已经从硬盘加载到内存中了&#xff0c;然后这些代码又通过jmpi跳转到0x90200处&#xff0c;即硬盘第二个扇区开始处的内容 这些内容就是第二个操作系统源代码文件setup.s 不过现在先来看一下操作系统的编译过程 操作系统的编译…