【C++】指针的基础知识 | 学习笔记

news2024/10/5 12:43:27

文章目录

  • 前言
  • 一、指针的定义和使用
    • 1.1、指针定义
    • 1.2、指针使用
  • 二、指针占用的内存空间
  • 三、空指针和野指针
    • 3.1.空指针
    • 3.2 野指针
  • 四、const修饰指针
    • 4.1 常量指针
    • 4.2 指针常量
    • 4.3 const既修饰指针也修饰常量
  • 五、指针,数组,函数混用案例
    • 5.1 指针和数组混用
    • 5.2 指针和函数混用
    • 5.3 指针,数组,函数混用


前言

本篇笔记是基于B站课程:C++视频教程
跟着视频我也相当于把代码又敲了一遍

一、指针的定义和使用

1.1、指针定义

指针存放的就是一个地址。
在main函数里,定义如下(以变量a的地址为例子):

int a = 10;
int * p; // 定义指针变量p
p = &a; //&a返回的是a的地址,并将其存放到指针p中

也可以一步到位:

int a = 10;
int * p=&a;

总体代码如下:

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	int * p=&a; //指针存放的就是地址
	cout << "指针P为"<< p << endl;
	cout << "变量a的地址是"<<&a << endl;
	return 0;
}

结果:
在这里插入图片描述

1.2、指针使用

在指针前加一个“*”,就能使用其“解引用”的功能,找到指针指向的内存,进行操作,如下所示:

*p = 10000;

完整例子如下:

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	int * p=&a; //指针存放的就是地址
	cout << "指针P为"<< p << endl;
	cout << "变量a的地址是"<<&a << endl;
	*p = 10000;
	cout << "变量a为" << a << endl;
	cout << "*p为" << *p << endl;
	return 0;
}

在这里插入图片描述
从结果我们可以看到,变量a的值被修改为了10000,这正是*p的功劳。

二、指针占用的内存空间

32位操作系统下,指针内存占用都是4个字节:

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	int * p = &a; 
	cout << sizeof(p) << endl;
	cout << sizeof(int *) << endl;
	cout << sizeof(char *) << endl;
	cout << sizeof(float *) << endl;
	return 0;
}

在这里插入图片描述
64位操作系统下,指针内存占用是8字节
在VS2017这里,可以切换32位系统和64位系统:
在这里插入图片描述
64位下的最终结果:
在这里插入图片描述

三、空指针和野指针

3.1.空指针

定义:指针变量指向内存编号为0的空间。
一般来说空指针用作初始化,其指向的内存是不能访问的。

空指针的定义如下:

int * p = NULL

当我们想访问使用它时,会报错:

#include <iostream>
using namespace std;
int main()
{
	int * p = NULL;
	cout << *p << endl;
	return 0;
}

或者

#include <iostream>
using namespace std;
int main()
{
	int * p = NULL;
	*p = 10000;
	return 0;
}

在这里插入图片描述
0-255号内存是系统占用的,无法访问。

3.2 野指针

定义:指针变量指向非法的内存空间
代码如下(示例):

#include <iostream>
using namespace std;
int main()
{
	int * p = (int *)0x1100;
	cout << *p << endl;
	return 0;
}

上面0x1100这块内存,之前是没有定义的,这里就越界了。
在这里插入图片描述


四、const修饰指针

4.1 常量指针

定义方法:

const int * p = &a

指针的指向可以修改,但是指针指向的值不能改:
下面是可行的:

p = &b;

下面是不可行的

*p = 10000;

4.2 指针常量

定义方法:

const int * p = &a

指针的指向不可以修改,但是指针指向的值可以改:
下面是可行的:

*p = 10000;

下面是不可行的

p = &b;

4.3 const既修饰指针也修饰常量

定义方法:

const int * const p = &a

指针的指向不可以修改,指针指向的值也不可以改:
下面是不可行的:

*p = 10000;

下面是不可行的

p = &b;

五、指针,数组,函数混用案例

5.1 指针和数组混用

#include <iostream>
using namespace std;
int main()
{
	int arr[] = { 1,2,3,4,5 };
	int *p = arr; //arr是数组首地址
	cout << "第一个元素是" << arr[0] << endl;
	cout << "指针访问的第一个元素是" << *p << endl;

	for (int i = 0; i < 5; i++)
	{
		cout << *p << endl;
		p++;
	}
	return 0;
}

在这里插入图片描述

5.2 指针和函数混用

值传递,地址传递
值传递不会改变实参,而地址传递会改变实参
(1)值传递

#include <iostream>
using namespace std;
void swap1(int a1, int b1)
{
	int temp = a1;
	a1 = b1;
	b1 = temp;
	cout << "a1是" << a1 << endl;
	cout << "b1是" << b1 << endl;
}

int main()
{
	int a = 10;
	int b = 20;
	swap1(a, b);
	cout << "a是"<<a << endl;
	cout <<"b是"<< b << endl;
	return 0;
}

在这里插入图片描述
形参改变了,但是实参没有改变
(2)地址传递

#include <iostream>
using namespace std;
void swap2(int * p1, int * p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	cout << "*p1是" << *p1 << endl;
	cout << "*p2是" << *p2 << endl;
}
int main()
{
	int c = 100;
	int d = 200;
	swap2(&c, &d);
	cout << "c是" << c << endl;
	cout << "d是" << d << endl;
	return 0;
}

在这里插入图片描述
形参改变了,实参也改变了

5.3 指针,数组,函数混用

下面是一个冒泡排序的例子

#include <iostream>
using namespace std;
void bubblesort(int * arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for(int j =0;j<len-1;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[5] = {3,6,9,2,5};
	int len = sizeof(arr) / sizeof(arr[0]);
	bubblesort(arr, len);
	printarray(arr, len);
	return 0;
}

在这里插入图片描述

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

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

相关文章

Talk预告 | 上海交通大学计算机系博士生李杰锋方浩树:多人场景,全身136关键点检测与跟踪框架AlphaPose技术讲解

本期为TechBeat人工智能社区第466期线上Talk&#xff01; 北京时间12月28日(周三)20:00&#xff0c;上海交通大学计算机系博士生——李杰锋&方浩树的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “多人场景&#xff0c;全身136关键点检测与…

初识Unity

视频教程&#xff1a;史上最全Unity3D教程 常用快捷键 1.按住鼠标滚轮&#xff0c;拖动场景 2.滑动鼠标滚轮&#xff0c;缩放场景 3.右键&#xff0c;旋转视角 4.右键W、A、S、D&#xff0c;漫游视角&#xff0c;同时按下Shift可加速移动 5.alt鼠标左键&#xff0c;环视…

【财务】FMS财务管理系统---费用管理

在FMS财务管理系统中&#xff0c;和公司主营业务收入相关的费用有哪些&#xff1f;本篇文章中&#xff0c;笔者对具体分类和流程进行了系统的分析和总结&#xff0c;与大家分享。 财务中的费用管理主要包括销售费用、财务费用、管理费用等几大部分&#xff0c;看到费用大家首先…

C#,图像二值化(06)——全局阈值的大津OTSU算法及其源代码

1、大津OTSU算法 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的&#xff0c;是一种自适应阈值确定的方法&#xff0c;又叫大津法&#xff0c;简称OTSU&#xff0c;是一种基于全局的二值化算法&#xff0c;它是根据图像的灰度特性,将图像分为前景和背景两个部分。…

Git简介以及安装

目录 一、Git简介 1、版本控制系统简介 2、 Git的安装 a、安装git b、Git 的配置 二&#xff0c;本地仓库 三、GIT分支操作 1、关于分支 2. 分支基本操作 3、分支合并 4、冲突 一、Git简介 1、版本控制系统简介 版本控制系统&#xff08;VCS&#xff09;是将『什么…

【数据结构】直接插入排序,希尔排序,选择排序,堆排序

文章目录排序的概念直接插入排序希尔排序选择排序堆排序排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…

keras环境搭建

目录 1. 安装miniconda 2. 安装CPU版本的tensorflow 2. 安装keras 3. 安装依赖库 4. 测试 环境&#xff1a;win10&#xff0c;无独立显卡&#xff0c;不用GPU加速。 1. 安装miniconda Miniconda3-latest-Windows-x86_64.exe &#xff08;1&#xff09;安装目录可自选&a…

生成对抗:Pix2Pix

cGAN : Pix2Pix 生成对抗网络还有一个有趣的应用就是&#xff0c;图像到图像的翻译。例如:草图到照片&#xff0c;黑白图像到RGB&#xff0c;谷歌地图到卫星视图&#xff0c;等等。Pix2Pix就是实现图像转换的生成对抗模型&#xff0c;但是Pix2Pix中的对抗网络又不同于普通的GAN…

计网第三章.数据链路层—可靠传输

以下来自湖科大计算机网络公开课的笔记 文章目录0.基本概念1. 停止等待协议SW2. 回退N帧协议GBN3. 选择重传SR首先&#xff0c;这部分说的可靠传输的实现机制不只限于数据链路层&#xff0c;而是适用于整个计算机网络体系 0.基本概念 一般情况下&#xff0c;有线链路的误码率…

Docker 中的挂载卷

我们现在有这样一个需求。 我们有一个 Spring 的项目是部署在容器中的&#xff0c;如果不进行任何配置的话&#xff0c;这个项目运行的所有日子都会在容器中。 当容器重启说着终止后&#xff0c;上面的日志比较难进行查看。 我们希望我们的日志同时也记录在操作系统中&#…

阿贡国家实验室:量子中继器及其在量子网络中的作用

很多人小时候都玩过传声筒游戏&#xff1a;A将消息小声告诉B&#xff0c;然后B将他听到的内容小声告诉C&#xff0c;依此类推&#xff0c;玩过的人都知道&#xff0c;最后传达到的信息往往和真实消息完全不同。 从某种意义上说&#xff0c;这和中继器技术的重要性强相关。中继器…

MySQL锁,锁的到底是什么?

只要学计算机&#xff0c;「锁」永远是一个绕不过的话题。MySQL锁也是一样。 一句话解释MySQL锁&#xff1a; MySQL锁是解决资源竞争的一种方案。 短短一句话却包含了3点值得我们注意的事情&#xff1a; 对什么资源进行竞争&#xff1f;竞争的方式&#xff08;或者说情形&a…

舆情监控和应急处理方案,如何做好网络舆情监控?

舆情监控是指通过不同的渠道&#xff0c;如社交媒体、新闻媒体、博客、论坛等&#xff0c;对公众的言论进行收集、分析、评估和反馈的过程。舆情监控的目的是帮助企业或组织了解公众的观点和情绪&#xff0c;并且能够及时做出回应&#xff0c;避免可能出现的舆论危机。接下来TO…

2022年度投影仪行业数据分析报告:十大热门品牌排行榜

在当前的大环境下&#xff0c;线下娱乐受阻&#xff0c;而用户对于足不出户的观影、娱乐需求推动着智能投影设备的增长。近几年来&#xff0c;投影仪行业保持着较快速度的增长&#xff0c;面对整体市场需求不振的形势&#xff0c;投影仪仍在保持正向增长。随着家用智能投影在市…

Charles - 阻塞请求、修改请求与响应内容、重定向请求地址、指定文件为响应内容

1、阻塞请求 1、鼠标放在指定接口上 > 右键 > 勾选 Block List 2、重新访问这接口&#xff0c;这条请求被阻塞&#xff0c;不会有返回信息 取消阻塞接口&#xff1a; 鼠标放在指定接口上 > 右键 > 取消勾选 Block List 2、修改请求与响应内容 第一步&#xff1…

【一文看懂 ES 核心】存储查询集群

一文看懂 ES 核心 Elasticsearch 作为一个搜索引擎&#xff0c;其可以提供高效的搜索匹配数据的能力&#xff0c;对于这类工具了解其运行原理其实是有一套功法的。 聊存储&#xff0c;ES 是如何存储数据的&#xff1f;聊方法&#xff0c;ES 是如何进行搜索匹配的&#xff1f;…

【Linux】文件描述符、文件操作、重定向的模拟实习

目录 一、重温C语言文件操作 1.1 文件打开方式 1.2 文件写操作 1.3 文件读操作 1.3 标准输入输出 二、系统接口的使用 2.1 open 函数 2.2 close 函数 2.3 write 函数 2.4 read 函数 三、文件描述符 3.1 如何管理文件 3.2 0 & 1 & 2 3.3 文件描述符的分配…

种草!超好用的PDF转换器上线啦~

宝子们 重磅福利来啦 你还在为每次转换文件头疼吗 老铁&#xff0c;大拿版万能转换器正式上线啦 以前的文件转换器&#xff0c;不是充会员就是收费高 最坑的是花钱还解决不了问题 每次转换文件内容有误.... 特殊符号或者公式更是无法有效转换 为了整顿这种局面&#xff0c…

KKT条件理解

我们知道拉格朗日函数是用于等式约束的优化问题求解的&#xff0c;然KKT条件是针对含有不等式约束的优化问题的。 首先&#xff0c;我们先给出优化目标&#xff1a; 因此&#xff0c;根据优化目标&#xff0c;我们同样可以构造处拉格朗日函数&#xff0c;并对其进行优化&#…

ssh免密登录

准备两台linux主机 主机A&#xff1a;192.168.92.131 主机B&#xff1a;192.168.92.132 使用主机B去免密访问主机A 在主机B上执行 ssh-keygen -t rsa ssh-keygen 生成密码对 -t rsa 指定生成 rsa 密钥对 密钥对文件默认放在 家目录下面的 .ssh 目录下 root 用户默认放在 /ro…