【C++基础入门】七、指针(定义和使用、所占内存空间、空指针和野指针、const关键字修饰指针、指针和数组、指针和函数)

七、指针

7.1 指针的基本概念

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

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

7.2 指针变量的定义和使用

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

示例:

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

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

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

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

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

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

7.3 指针所占内存空间

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

在32位操作系统下:占用4个字节空间,64位下占用8个字节

示例:

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个字节

7.4 空指针和野指针

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

用途: 初始化指针变量

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

示例1:空指针

int main() {//指针变量p指向内存地址编号为0的空间int * p = NULL;//访问空指针报错 //内存编号0 ~255为系统占用内存,不允许用户访问cout << *p << endl;system("pause");return 0;
}

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

示例2:野指针

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

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

7.5 const修饰指针

const修饰指针有三种情况

  1. const修饰指针 — 常量指针
    在这里插入图片描述

  2. const修饰常量 — 指针常量
    在这里插入图片描述

  3. const即修饰指针,又修饰常量
    在这里插入图片描述

示例:

int main() {int a = 10;int b = 10;//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; //错误system("pause");return 0;
}

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

7.6 指针和数组

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

示例:
在这里插入图片描述

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.7 指针和函数

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

示例:
在这里插入图片描述

//值传递
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;
}

总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递

7.8 指针、数组、函数

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

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

示例:

//冒泡排序函数
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.mzph.cn/news/674221.shtml

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

相关文章

DevOps落地笔记-21|业务价值:软件发布的最终目的

上一课时介绍如何度量软件的内部质量和外部质量。在外部质量中&#xff0c;我们提到用户满意度是衡量软件外部质量的关键因素。“敏捷宣言”的第一条原则规定&#xff1a;“我们最重要的目标&#xff0c;是通过持续不断的及早交付有价值的软件使用户满意”。从这一点也可以看出…

【Redis笔记】使用Redisson实现可重入锁

Redisson 官方github网站:https://github.com/redisson/redisson Redisson官网&#xff1a;https://redisson.org/ 依赖引入 pom.xml文件中写入 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version&…

2024.1.29力扣每日一题——自由之路

2024.1.29 题目来源我的题解方法一 动态规划 题目来源 力扣每日一题&#xff1b;题序&#xff1a;514 我的题解 方法一 动态规划 定义 dp[i][j] 表示从前往后拼写出 key的第 i个字符&#xff0c; ring 的第 j个字符与 12:00 方向对齐的最少步数&#xff08;下标均从 0 开始&…

2024.2.6

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&g…

简化版SpringMVC

简化版SpringMVC web.xml xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&quo…

C#面:什么是ASP.NET中的用户控件

在 ASP.NET 中&#xff0c;用户控件是一种可重用的自定义控件&#xff0c;它允许开发人员将一组相关的 HTML 和服务器控件封装在一个单独的组件中。用户控件可以像其他内置控件一样在页面上使用&#xff0c;并且可以通过添加自定义属性和事件来扩展其功能。 用户控件通常由一个…

【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏2(附项目源码)

最终效果 文章目录 最终效果系列目录前言添加捕食者动画控制源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第24篇中&#xff0c;我们将探索如何用unity制作一个3D动物AI生态系统游戏…

如何在 emacs 上开始使用 Tree-Sitter (archlinux)

文章目录 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 在archlinux上使用比windows上不知道要方便多少倍&#xff01; $ sudo pacman -S emacs $ sudo pacman -S tree-sitter这里…

第6章——深度学习入门(鱼书)

第6章 与学习相关的技巧 本章将介绍神经网络的学习中的一些重要观点&#xff0c;主题涉及 寻找最优权重参数的最优化方法、权重参数的初始值、超参数的设定方法 等。此外&#xff0c;为了应对过拟合&#xff0c;本章还将介绍 权值衰减、Dropout等正则化方法&#xff0c;并进行实…

Redis(02)——事务管理

事务概念 Redis事务的本质是一组命令的集合。事务支持一次执行多个命令&#xff0c;一个事务中所有命令都会被序列化&#xff0c;在事务执行过程中&#xff0c;会按照顺序串行化执行队列中的命令&#xff0c;其他客户端提交的命令请求不会插入到事务执行命令序列中 Redis事务…

Windows权限维持

注册表类&#xff1a; 普通注册表后门 在一般用户权限下&#xff0c;通常是将要执行的后门程序或脚本路径填写到如下注册表的键值中HKCU\Software\Microsoft\Windows\CurrentVersion\Run&#xff0c;键名任意。普通权限即可运行 cmd下操作&#xff1a; reg add "HKEY_…

我差一点就中了Magniber勒索病毒

前言 勒索攻击已经成为了全球最大的网络威胁&#xff0c;越来越多的黑客组织开始加入到勒索病毒攻击活动&#xff0c;目前勒索病毒黑客组织大致可以分为两类&#xff0c;一类攻击目标主要以TO C(个人)为主&#xff0c;一类攻击目标主要以TO B(企业)为主&#xff0c;前者的勒索…

C# CAD交互界面-自定义面板集(四)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System.Windows.Forms; 二、程序说明 创建自定义面板集&#xff08;PaletteSet&#xff09;的C#命令方法实现。该方法名为CreatePalette&#xff…

Redis篇之持久化

一、为什么要进行持久化 Redis是一个基于内存的键值存储系统&#xff0c;但为了保证数据在服务器重启、故障等情况下不丢失。 二、应该怎么持久化 1.RDB持久化 &#xff08;1&#xff09;RDB是什么 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff…

macOS虚拟机在VMware Workstation/Player上的详细安装与配置教程

一、准备工作 1. 确认兼容性 确保你的宿主机满足运行macOS虚拟机的要求&#xff1a; 操作系统&#xff1a;支持Windows或Linux&#xff08;宿主机需64位操作系统&#xff09;。硬件配置&#xff1a;足够的RAM&#xff08;至少8GB推荐&#xff0c;安装Big Sur或更高版本建议1…

流程引擎activiti、flowable、camunda简单介绍

市场上比较有名的开源流程引擎有osworkflow、jbpm、activiti、flowable、camunda。 其中&#xff1a;Jbpm4、Activiti、Flowable、camunda四个框架同宗同源&#xff0c;祖先都是Jbpm4&#xff0c;开发者只要用过其中一个框架&#xff0c;基本上就会用其它三个。 推荐使用camu…

什么是集群服务器

近一段时间来&#xff0c;集群服务器被广大站长热议&#xff0c;所谓集群服务器就是指很多台服务器把它们集中在一起来进行同一种服务。集群服务器也可以由很多个的计算机并行去计算&#xff0c;这样可以获得非常高的计算速度&#xff0c;提升服务器整体的工作效. 其实我们都知…

【原创】MQTT开发笔记(四)- 压力测试

一、前言 Jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须先要安装 …

2.7通过select、多进程、多线程实现一个并发服务器

select #include <myhead.h>#define PORT 8888 //端口号 #define IP "192.168.250.100" //IP地址int main(int argc, const char *argv[]) {//1、创建用于接受连接的套接字int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror(&…

C语言带颜色输出

我们在做函数API功能测试时或其他数据解析时&#xff0c;为了区分信息内容&#xff0c;可以给不同级别的输出加上不同的颜色&#xff0c;以方便查看。 如&#xff0c;我自己的一个项目中的显示效果&#xff1a; 这样做可以更加清晰的反应数据信息&#xff01; 实现原理&#x…