C++学习笔记——指针

news2025/2/26 3:04:04

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

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

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

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

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

相关文章

AI大模型开发架构设计(3)——如何打造自己的大模型

文章目录 如何打造自己的大模型1 新时代职场人应用AIGC的5重境界2 人人需要掌握的大模型原理职场人都能听懂的大语音模型的训练过程职场人都能听得懂的大语言模型的Transformer推理过程 3 如何构建自己的大模型需要具备三个方面的能力LangChain是什么&#xff1f;LangChain主要…

【精选】中间件 tomcat漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

在腾讯云买了云服务器和域名如何快速建网站?

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程&#xff0c;…

基于SQL的可观测性现状观察

本文字数&#xff1a;8975&#xff1b;估计阅读时间&#xff1a;23 分钟 作者&#xff1a;Ryadh Dahimene 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 1375年的加泰罗尼亚地图所展示的地中海地区。通商媒介语&#xff08;Lingua F…

深度学习记录--正则化(regularization)

什么是正则化&#xff1f; 正则化(regularization)是一种实用的减少方差(variance)的方法&#xff0c;也即避免过度拟合 几种正则化的方法 L2正则化 又被称为权重衰减(weight dacay) 在成本函数中加上正则项&#xff1a; 其中 由于在w的更新过程中会递减&#xff0c;即权…

STL---Stack和Queue

一、stack的介绍和使用 &#xff08;1&#xff09;介绍 翻译: &#xff08;1&#xff09;stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 &#xff08;2&#xff09; stack是作为容器…

【2020】百度校招Java研发工程师笔试卷(第二批)算法题

贴一下我去年9月份写的博客 三道编程题&#xff0c;一道数学题&#xff0c;两道图论&#xff0c;哎嘿嘿&#xff0c;我就是不会做&#xff0c;哎嘿嘿&#xff0c;哭了。。。 一.最小值 牛牛给度度熊出了一个数学题&#xff0c;牛牛给定数字n,m,k&#xff0c;希望度度熊能找到…

【小沐学GIS】基于C#绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

【二叉树练习2】

文章目录 判断是否是完全二叉树找出p和q的最近的公共祖先非递归实现前序遍历非递归实现中序遍历非递归实现后序遍历 判断是否是完全二叉树 boolean isCompleteTree(TreeNode root){if (root null){return true;}//创建队列Queue<TreeNode> queue new LinkedList<>…

文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题

七、用go语言&#xff0c;假设用 RB-INSERT 将一个结点 x 插入一棵红黑树&#xff0c;紧接着又用 RB-DELETE 将它从树中删除。结果的红黑树与初始的红黑树是否一样&#xff1f;证明你的答案。 文心一言&#xff1a; 首先&#xff0c;我们需要明确RB-INSERT和RB-DELETE的基本操…

“gradle project sync failed”

很久没打开AndroidStudio了&#xff0c;打开电脑发现这个软件都没了。重新安装后创建项目不成功&#xff0c;就提示了这个错误。 错误原因 “gradle project sync failed”&#xff1a;gradle没有配置成功。在安卓项目下找到目标文件&#xff1a;gradle --> wrapper -->…

机械设计-哈工大课程学习-螺旋传动

二、摩擦类型 1、静态摩擦&#xff1a;这是身体静止时所经历的摩擦。换句话说&#xff0c;就是身体有运动倾向时的摩擦力。 2、动态摩擦&#xff1a;这是身体在运动时所经历的摩擦。也称为动摩擦。动摩擦有以下两种类型&#xff1a; ①滑动摩擦&#xff1a;一个物体在另一个…

赛车游戏简单单车C语言版

#include<stdio.h> #include<easyx.h> #include<time.h>#define WIDTH 512 #define HEIGHT 768//定义一个汽车类 struct FCar {//坐标float x, y;// 汽车种类int type;//汽车速度float speed; };//定义全局变量 图片坐标 IMAGE BG_IMG; //背景图片坐标 float…

SV学习——数据类型(1)

文章目录 1. 内建数据类型2. 用户自定义3. 枚举类型 1. 内建数据类型 SV中引入新的数据类型logic&#xff0c;SV作为侧重于验证的语言&#xff0c;并不十分关切logic对应的逻辑应该被综合位寄存器还是线网&#xff0c;因为logic被使用的场景如果是验证环境&#xff0c;那么它只…

AI对比:ChatGPT与文心一言的异同与未来

文章目录 &#x1f4d1;前言一、ChatGPT和文心一言概述1.1 ChatGPT1.2 文心一言 二、ChatGPT和文心一言比较2.1 训练数据与知识储备2.2 语义理解与生成能力2.2 应用场景与商业化探索 三、未来展望3.1 模型规模与参数数量不断增加3.2 多模态交互成为主流3.3 知识图谱与大模型的结…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS&#xff08;原为Raspbian&#xff09;是为树莓派基于Debian开发的操作系统。 从2015年起&#xff0c;树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布&#xff0c;至…

Unity中实现捏脸系统

前言 目前市面上常见的捏脸一般是基于BlendShapes和控制骨骼点坐标两种方案实现的。后者能够控制的精细程度更高&#xff0c;同时使用BlendShapes来控制表情。 控制骨骼点坐标 比如找到控制鼻子的骨骼节点修改localScale缩放&#xff0c;调节鼻子大小。 BlendShapes控制表…

modelscope下载模型

# 私有模型下载&#xff0c;前提是您有响应模型权限 方法1 git lfs install git clone http://oauth2:your_git_tokenwww.modelscope.cn/<namespace>/<model-name>.git 如何获取git token 用您的账号登录https://www.modelscope.cn &#xff0c;在个人中心->访…

10本审稿及出版效率均较好的医学SCI期刊参数分享!

常笑医学整理了适合医务工作者进行论文投稿的医学SCI期刊&#xff0c; 审稿及出版效率均较好&#xff0c;附期刊详细参数&#xff0c;供大家参考。 1.CLINICAL CHEMISTRY AND LABORATORY MEDICINE&#xff08;临床化学与实验医学&#xff09; &#xff08;详细投稿信息请点击刊…

【Java】Maven的安装与配置

初识Maven Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09; 提供了一套依赖管理机制 标准化的…