C++学习笔记——指针

1,指针的基本概念

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

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

上图中的p就是a变量的指针,也可以记作*a

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

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

int main(){
	//1,指针的定义 
	int a=10;
	int *p; 
	p=&a;//指针指向变量a的地址 
	cout<<"a的地址为 "<<&a<<endl;//打印数据a的地址:0x6ffe14
	cout<<"指针p为 "<<p<<endl;//打印指针变量p:0x6ffe14
	//2, 使用指针
	//可以通过解引用的方式来找到指针指向的内存 
	//指针前加*代表解引用,找到指针指向的内存中的数据
	*p=1000;
	cout<<"a= "<<a<<endl;
	cout<<"*p= "<<*p<<endl; 
}

*p——解引用的含义,可以通过指针来保存一个地址: 

3,指针所占内存空间

指针与数组一样,也是一种数据结构,既然是一种数据结构,那么所占的内存空间是多少呢?

  • 在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型。
  •  在64位操作系统下,指针是占8个字节空间大小。(博主这里的os用的是64位的)

4,空指针和野指针

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

用途:初始化指针变量

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

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

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

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

(int *)0x1100的作用在于将后面的0x1100十六进制数强制转换为内存地址。 

5,const修饰指针

const——n.常数;恒量        adj.恒定的;不变的

假设有以下情景,a,b,p的值如下


const修饰指针有三种情况:

1,const修饰指针——常量指针

特点:指针的指向可以修改,但指针指向的值不可以修改

const int *p=&a;
*p=20;//错误,指针指向的值不可以修改
p=&b//正确,指针的指向可以改

 (红框为不允许)

2,const修饰常量——指针常量

特点:指针的指向不可以改,指针指向的值可以改,与常量指针正好相反。 

int * const p=&a;
*p=20;//正确,指向的值可以改
p=&b;//错误,指针指向不可以改

(红线为不允许)

3,const既修饰指针,又修饰常量

特点,指针的指向和指针指向的值都不可以改

const int * const p=&a;
*p=20;//错误
p=&b;//正确

 (红线红框均不可改)

6,指针和数组

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

#include<bits/stdc++.h>
using namespace std;
int main(){
	int arr[]={1,2,3,4,5,6,7,8,9,10};
	int *p=arr;
	for(int i=0;i<10;i++){
		cout<<*p<<endl;
		p++;//因为p是整形指针,p++的时候地址就会移动四个字节,到数组的下一个数据。
	}
}

输出结果: 

7,指针和函数

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

#include<bits/stdc++.h>
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(){
	//指针和函数
	//1,值传递
	int a=10;
	int b=20;
	//swap1(a,b);a=20,b=10
	//2,地址传递
	//如果是地址传递,可以修饰实参
	swap2(&a,&b);
	cout<<"a= "<<a<<"b= "<<b<<endl; //a=20,b=10
}

 a,b更换前后,内存空间的内容变化。

8,指针,数组,函数

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

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

#include<bits/stdc++.h>
using namespace std;
void swap(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;
			}
		}
	}
} 
void printarr(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=10;
	swap(arr,len);
	printarr(arr,len);
}

此案例的重点在于让我们学会:

  • 将数组传进函数中,即是把数组首地址传入即可
  • 冒泡排序熟练的运用
  • 为使函数体更加灵活,在数组长度方面选择一个形参,而非固定长度

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

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

相关文章

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…

头条文章采集ChatGPT4.0改写软件环境配置教程步骤

大家好&#xff0c;我是淘小白~ 下面给大家整理一下&#xff0c;ChatGPT4.0改写软件环境配置教程 下面是我们拿到的环境配置软件&#xff0c;分别是&#xff1a;117版本的谷歌浏览器&#xff0c;谷歌浏览器驱动&#xff0c;notepad&#xff08;用于打开config.ini&#xff0c…

由于找不到msvcp140.dll无法继续执行的5种解决方法

在计算机系统中&#xff0c;如果未能成功找到或加载msvcp140.dll这个动态链接库文件&#xff0c;可能会引发一系列运行问题和功能障碍。msvcp140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序来说&#xff0c;它是至关重…

ASP.NET Core 高级之使用Redis缓存

阅读本文你的收获 了解Redis基本作用及其使用场景学会安装Redis服务端和客户端及简单的命令行操作学习在ASP.NET Core WebAPI项目中如何操作Redis缓存 一、Redis介绍 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键…

全国各城市绿地及绿化面积数据,shp/excel格式,2020-2022年

基本信息. 数据名称: 全国各城市绿地及绿化面积数据 数据格式: Shp、excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2city城市名称4city_dm城市…

通过浏览器URL地址,5分钟内渗透你的网站!很刑很可拷!

今天我来带大家简单渗透一个小破站&#xff0c;通过这个案例&#xff0c;让你深入了解为什么很多公司都需要紧急修复各个中间件的漏洞以及进行URL解析拦截等重要操作。这些措施的目的是为了保护网站和系统的安全性。如果不及时升级和修复漏洞&#xff0c;你就等着被黑客攻击吧&…

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 此自动化脚本将帮助你使用 Python 中的 Android 调试桥 (ADB) 自动化你的智能手机。下面我将展示如何自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 您可以了解有关 ADB 的更多信息,…

测量USB接口信号眼图质量

此处只描述High&#xff0d;Speed模式信号质量的测试方法&#xff0c;Full&#xff0d;Speed测试方法可参考High&#xff0d;Speed测试方法。测试前连接好电路&#xff0c;对于USB 2.0 Host设备&#xff0c;差分探头TDP3500尽量靠近芯片信号输出地方&#xff0c;并注意极性不要…

[Tomcat] [最全] 目录和文件详解

打开tomcat的解压之后的目录可以看到如下的目录结构&#xff1a; Bin bin目录主要是用来存放tomcat的命令&#xff0c;主要有两大类&#xff0c;一类是以.sh结尾的&#xff08;linux命令&#xff09;&#xff0c;另一类是以.bat结尾的&#xff08;windows命令&#xff09;。 …

RFID智能产线设计管理方案

在传统的制造企业中&#xff0c;日常管理主要集中在产品管理、质量管理、仓库管理、移动资产管理、现场人员管理、车队管理等方面&#xff0c;而传统的人工采集和手工输入方式存在准确性不足和错误率高的问题&#xff0c;手工输入只能定时进行&#xff0c;导致生产计划只能按周…

工业智能网关储能物联网应用实现能源的高效利用及远程管理

储能电力物联网是指利用物联网技术和储能技术相结合&#xff0c;实现对电力系统中各种储能设备的智能管理和优化控制。随着可再生能源的不断发展和应用&#xff0c;电力系统面临着越来越大的电力调度和储能需求而储能电力物联网的出现可以有效解决这一问题&#xff0c;提高电力…

保姆级CISP报考攻略,让你不再迷茫

信息安全领域越来越火&#xff0c;想要在这个行业闯出一片天&#xff1f;CISP认证就是你的“敲门砖”&#xff01;想知道如何顺利考取这个超牛的证书吗&#xff1f;下面就带你一起探索保姆级CISP报考流程&#xff01;&#x1f389; &#x1f393;报考条件&#x1f393; 学历专业…

年末怒赚一笔,程序员快码住!趁热接单

元旦已过&#xff0c;龙年将至。 有钱没钱&#xff0c;回家过年。 话说回来&#xff0c;年关将至&#xff0c;农历的2023即将落下帷幕。天气渐寒&#xff0c;你的钱包是否也让你心生寒意&#xff1f;年初立下的赚钱flag是否优雅地实现了? 如果flag都倒了&#xff0c;你先别…

csdn发布文章审核一直未通过解决办法

搞了很久的confluence&#xff0c;踩了很多坑终于弄好了&#xff0c;却一直显示审核不通过&#xff0c;给笔记一顿狂改还是不通过&#xff0c;一直说是版权问题就很让人起疑&#xff0c;最后问了客服才知道&#xff0c;现在开始查版权问题&#xff0c;所以我给confluence笔记中…

Git仓库里嵌着别的仓库导致出现问题

例如这样&#xff0c;git仓库里面有箭头&#xff0c;且仓库打开是一个空仓库。 解决问题的方法 1.到子仓库路径下&#xff0c;使用ls -a指令可以看到文件夹下有一个.git文件夹。 我们使用rm -rf <子仓库路径>/.git删除每个子仓库下面的.git文件夹。 2.执行git rm --cache…

把握好这5个阶段,快速成交优质外贸客户

要想快速成交一个有潜力的优质客户往往需要经历五个阶段。这五个阶段分别是&#xff1a;“获联”、“筛选”、“入野”、“破局”、“快速成交”。 01 获联 我们的第一步工作&#xff0c;就是需要主动或者被动去吸引客户&#xff0c;把客户引进来。将客户引进来的方式有…

基本语法和 package 与 jar

3.基本语法 1.输入输出 // 导入 java.util 包中的 Scanner 类 import java.util.Scanner;// 定义名为 ScannerExample 的公共类 public class ScannerExample {// 主方法&#xff0c;程序的入口点public static void main(String[] args) {// 创建 Scanner 对象&#xff0c;用…

对 MODNet 其他模块的剪枝探索

写在前面 先前笔者分享了《对 MODNet 主干网络 MobileNetV2的剪枝探索》&#xff0c;没想到被选为了CSDN每天值得看系列&#xff0c;因为笔者开设的专栏《MODNet-Compression探索之旅》仅仅只是记录笔者在模型压缩领域的探索历程&#xff0c;对此笔者深感荣幸&#xff0c;非常…

vue3 npm i 一直卡到不动

一. 首先node 版本要18.0及以上 查看node版本并安装指定版本 二. 查看npm镜像源以及指定安装npm的镜像 三. 删除项目中的package-lock.json文件 最好是把node_modules安装包也删除掉&#xff0c;然后npm i 就可以了