C++入门05—指针

news2024/11/27 10:19:23

1. 指针的基本概念

指针的作用: 可以通过指针间接访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示

  • 可以利用指针变量保存地址

 

2. 指针变量的定义和使用

指针变量定义语法: 数据类型 * 变量名;

示例:

#include <iostream>
using namespace std;

int main() {

	//1、指针的定义


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


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


	//2、指针的使用
    // 通过解引用的方式找到指针指向的内存
	//指针前加*表示解引用,通过*操作指针变量指向的内存
	cout << "通过*操作指针变量指向的内存 *p = " << *p << endl;

	system("pause");

	return 0;
}

 

运行结果表明:
a = 10;

p = &a; (p即为指针变量,表示的是变量a所在的地址)

*p=a=10; (*p 是通过应用指针变量中的地址,访问地址中对应的数据)

 

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

  • 普通变量存放的是数据,指针变量存放的是地址

  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用

总结1: 我们可以通过 & 符号 获取变量的地址

总结2:利用指针可以记录地址

总结3:对指针变量解引用,可以操作指针指向的内存

 

3. 指针所占内存空间

提问:指针也是种数据类型,那么这种数据类型占用多少内存空间?

 

示例:

#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;
}

 

总结:所有指针类型在32位操作系统下是4个字节

 

4. 空指针和野指针

4.1 空指针

空指针:指针变量指向内存中编号为0的空间

用途:如果一开始时不知道指针变量指向哪里比较合适,可以将其指向编号为0的空间,即初始化指针变量

注意:空指针指向的内存是不可以访问的

示例1:空指针

#include <iostream>
using namespace std;

int main() {

	// 空指针
	// 1.空指针用于给指针变量进行初始化

	//指针变量p指向内存地址编号为0的空间
	int* p = NULL;

	//访问空指针报错 
	// *p = 100; // 会报错
	//内存编号0 ~255为系统占用内存,不允许用户访问
	cout << *p << endl;

	system("pause");

	return 0;
}

 

4.2 野指针

野指针:指针变量指向非法的内存空间

示例2:野指针

int main() {
​
    //指针变量p指向内存地址编号为0x1100的空间
    int * p = (int *)0x1100;
​
    //访问野指针报错 
    cout << *p << endl;
​
    system("pause");
​
    return 0;
}

总结:空指针和野指针都不是我们申请的空间,因此不要访问。

5. const修饰指针

const修饰指针有三种情况

  1. const修饰指针 --- 常量指针

  2. const修饰常量 --- 指针常量

  3. const即修饰指针,又修饰常量

常量指针:

const修饰了指针 int *p,那么*p就不可被修改。

 

 指针常量:

const修饰的是常量p=&a,所以p=&a的值不可以被修改。

const即修饰指针,又修饰常量:

总结:

const修饰了什么,被修饰的东西就不可被修改。

 

示例:

#include <iostream>
using namespace std;

int main() {

	int a = 10;
	int b = 10;

	// 1.常量指针
	//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
	const int* p1 = &a;
	p1 = &b; //正确
	//*p1 = 100;  报错

     // 2.指针常量
	//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
	int* const p2 = &a;
	//p2 = &b; //错误
	*p2 = 100; //正确

	//const既修饰指针又修饰常量
	const int* const p3 = &a;
	//p3 = &b; //错误
	//*p3 = 100; //错误

	system("pause");

	return 0;
}

技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量

6. 指针和数组

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

示例:

#include <iostream>
using namespace std;

int main() {

	// 利用指针访问数组中的元素

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

	int* p = arr;  //指向数组的地址  arr就是数组的地址

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

	for (int i = 0; i < 10; i++)
	{
		//利用指针遍历数组
		cout << *p << endl;
		p++; // 让指针向后偏移4个字节
	}

	system("pause");

	return 0;
}

7. 指针和函数

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

示例:

#include <iostream>
using namespace std;

//实现2个数字进行交换


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

int main() {

	int a = 10;
	int b = 20;
	swap1(a, b); // 值传递不会改变实参
	cout << "通过值传递swap1(int a, int b)的结果: "  << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;


	swap2(&a, &b); //地址传递会改变实参
	cout << "通过地址传递swap2(int* p1, int* p2)的结果: " << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

说明: 

 

总结:如果不想修改实参(即被传入函数的原数据),就用值传递,如果想修改实参,就用地址传递

8. 指针、数组、函数

案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序

例如数组:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

示例:

#include <iostream>
using namespace std;

//冒泡排序函数
void bubbleSort(int* arr, int len)  //int * arr 也可以写为int arr[]
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

//打印数组函数
void printArray(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << endl;
	}
}

int main() {

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

	bubbleSort(arr, len);

	printArray(arr, len);

	system("pause");

	return 0;
}

 

总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针

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

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

相关文章

如何防“AI换脸”诈骗

风险提示 “AI换脸”诈骗利用仿真技术冒充亲人、同事或公职人员声音相貌行骗&#xff0c;此类新型网络诈骗手段多样、门槛降低、辨别难度加大&#xff0c;常令公众放松警惕&#xff0c;短时间内造成较大损失。国家金融监督管理总局北京监管局近日发布风险提示&#xff1a;眼见…

震惊!原来BUG是这么理解的!什么是BUG?软件错误(BUG)的概念

较为官方的概念&#xff1a; 当且仅当规格说明是存在的并且正确&#xff0c;程序与规格说明之间的 不匹配才是错误。 当需求规格说明书没有提到的功能&#xff0c;判断标准以最终用户为准&#xff1a;当程序没有实现其最终用户合理预期的 功能要求时&#xff0c;就是软…

类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)

在之前的系列文章里&#xff0c;我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT&#xff0c;我们继续补完该系列。 今天要讲到的是小波分解&#xff0c;通常也就是指离散小波变换&#xff08;Discrete Wavelet Transform, DWT&#xff09;。在网上有一些介绍该方法…

AnyLogic 8.8.1---8.8.4 Crack,旧版不搞了

AnyLogic&#xff0c;是一款应用广泛的&#xff0c;对离散、系统动力学、多智能体和混合系统建模和仿真的工具。它的应用领域包括&#xff1a;物流、供应链、制造生产业、行人交通仿真、行人疏散、城市规划建筑设计、Petri网、城市发展及生态环境、经济学、业务流程、服务系统、…

Linux - 环境变量 - 常规命令 和 内建命令

推荐书籍&#xff0c;《深入理解Linux内核》。鸠摩搜书 | 全网电子书搜索引擎&#xff0c;小说人必备 | Tbox导航 (tboxn.com) 寄存器 你应该知道&#xff0c;代码是被加载到内存当中&#xff0c;cpu才能进行运算的&#xff0c;那么&#xff0c;我们在写函数返回值的时候&…

飞利浦双串口51单片机485网关

主要功能将PC端的数据接收下来&#xff0c;分发到不同的设备&#xff0c;也是轮询设备数据读取回来&#xff0c;打包回传到PC端&#xff0c;数据包包头包尾识别&#xff0c;数据校验&#xff0c;接收超时处理&#xff0c;将协议结构化处理&#xff0c;协议的改动不需要改动程序…

Python 算法高级篇:图的表示与存储优化

Python 算法高级篇&#xff1a;图的表示与存储优化 引言 1. 什么是图&#xff1f;2. 图的基本概念3. 图的表示方法3.1. 临接矩阵表示临接矩阵的优点&#xff1a;临接矩阵的缺点&#xff1a; 3.2. 邻接表表示邻接表的优点&#xff1a;邻接表的缺点&#xff1a; 4. 优化的存储方法…

开机流程、模块管理

一、开机流程 Linux系统组成 kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能rootfs 包括程序和 glibc 库 ​ 程序&#xff1a;二进制执行文件​ 库&#xff1a;函数集合, function, 调用接口&#xff08;头文件负责描述&#xff09; 开机流程…

13.6性能测试理论

一.什么是性能测试 1.定义: 测试人员借助性能测试工具(LoadRunner等),模拟系统在不同场景下(使用高峰期等),对应的性能指标是否达到预期. 2.性能测试和功能测试的区别: a.功能测试依靠人工,性能测试依靠工具. b)功能测试要求软件能正常运行,不管什么场景,性能测试要求软件…

[双指针] (二) LeetCode 202.快乐数 和 11.盛最多水的容器

[双指针] (二) LeetCode 202.快乐数 和 11.盛最多水的容器 快乐数 202. 快乐数 题目解析 (1) 判断一个数是不是快乐数 (2) 快乐数的定义&#xff1a;将整数替换为每个位上的和&#xff1b;如果最终结果为1&#xff0c;就是快乐数 (3) 这个数可能变为1&#xff0c;也可能无…

ESP-IDF编程指南

ESP-IDF 编程指南 - ESP32-C3 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com) ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP-IDF 物联网开发框架 | 乐鑫科技 (espressif.com.cn)

【Git企业开发】第二节.Git 的分支管理

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Git企业级开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff0…

一款功能强大的iOS设备管理软件Mazing 3中文版免费2024最新下载

Mazing 3中文版是一款功能强大的iOS设备管理软件&#xff0c;它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外&#xff0c;它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性&#xf…

解读deepLabV3+时遇到的问题总结

环境问题 python &#xff1a;3.10.12 ModuleNotFoundError: No module named ‘torchvision.models.utils 起初pip以下这个包&#xff0c;也没有解决问题&#xff1b;后来发现是版本的问题。 #from torchvision.models.utils import load_state_dict_from_url from torch.…

机器人入门(四)—— 创建你的第一个虚拟小车

机器人入门&#xff08;四&#xff09;—— 创建你的第一个虚拟小车 一、小车建立过程1.1 dd_robot.urdf —— 建立身体1.2 dd_robot2.urdf —— 添加轮子1.3 dd_robot3.urdf —— 添加万向轮1.4 dd_robot4.urdf —— 添加颜色1.5 dd_robot5.urdf —— 添加碰撞检测(Collision …

印度财团欲代工iPhone,路虎是前车之鉴,印度制造仍在梦中

随着印度财团塔塔收购纬创即将落寞&#xff0c;印度电子与科技国务部长强德拉谢克&#xff08;Rajeev Chandrasekhar&#xff09;为塔塔站台&#xff0c;表示两年内塔塔将制造iPhone并出口海外市场&#xff0c;印度制造将由此起飞。 一、印度制造在路虎上梦破 塔塔集团收购路虎…

手把手教你:如何用Java多线程模拟银行叫号服务

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我将和大家一起探讨一个非常有趣的话题——Java多线程模拟银行叫号服务。这不仅是一个有趣的编程练习&#xff0c;还可以帮助我们更好地理解多线程编程和并发控制。在这篇文章中&#xff0c;我将带领大家一步步实现一个…

cmd基本命令

一、cmd黑框是什么 cmd 是 Windows 命令提示符&#xff08;cmd.exe&#xff09;是 Windows NT 及以后的 Windows 系统下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序&#xff1b;或在 Windows CE 下只用于运行控制面板程序的外壳程序。 二、打开步骤 wind…

Tornado downloadable工程和Tornado bootable工程

目录 Tornado downloadable工程Tornado bootable工程 Tornado downloadable工程和Tornado bootable工程是两个不同类型的Tornado项目。 Tornado downloadable工程 Tornado downloadable工程是指可以通过下载安装程序来安装的Tornado项目,通常用于Web应用程序。这种工程通常包…

相亲APP哪个好用?找对象的相亲软件哪个能脱单?

现在市面上的相亲APP非常多&#xff0c;质量也参差不齐&#xff0c;需要我们自己去辨别才能找到靠谱的&#xff0c;但是这很浪费时间。所以今天就分享几个我用过靠谱的相亲APP给大家参考&#xff0c;也算是提供一点经验。 1、一伴婚恋 这款相亲软件的优势在于&#xff0c;每个…