C/C++指针操作整理

C/C++指针操作整理

面向曾经学习过指针的人,并非针对究极初学者。

一维指针

数据类型存储的地址,指向数据存储的地址,可以使用 &运算符取变量的地址,将其赋给指针变量。

int a = 2;
int *p = &a;

同时因为C/C++中数组是连续存储的,所以一个指针可以间接访问一个数组,可以通过指针的解引用访问该地址处存储的值。

知识点:

  • 一个数组的数组名默认代表这个数组的地址。
  • 可以通过 地址加减下标法 访问连续存储的数据。
int a[4] = {1, 2, 3, 4};
int *p = a;
for (int i = 0; i < 4; ++i) {// 下面两行代码等价,
//    std::cout << p[i] << " ";std::cout << *(p + i) << " ";
}

同样的,对于 char 类型,也有:

char s[] = "ABCDEF";
char *p = s; // s代表字符串首地址
for (int i = 0; i < int(strlen(s)); ++i) {// std::cout << p[i];std::cout << *(p + i); // 输出单个字符
}
std::cout << "\n";
std::cout << p << "\n"; // 输出整个字符串

特别的:针对 char 类型,可以直接输出首地址,编译器会自动将地址加一往后输出,直到遇到 \0 字符,即字符串结尾字符。(注意 string 类型没有 \0 结尾字符)

其他数据类型基本同理。

二维指针

即指针的指针,就是指针存储的是一个指针变量的存储地址,输出的时候就需要两层解引用了。

int val = 4;
int *p1 = &val;
int **p2 = &p1;
std::cout << **p2 << "\n";

数组指针和指针数组

1 数组指针

即数组的指针,代表整个数组的地址。由于 [] 优先级大于 *, 所以需要使用 () 代表 p 存储一个长度为 3 的数组的地址。

int (*p)[3];

2 指针数组

即数组中存储的是指针变量。

int *p[2];

一些指针操作

需要了解下new操作

1 创建二维动态数组

  • 方法一:利用二维指针,C++ new操作

定义一个二维指针,二维指针指向的是长度为 n 的数组(数组中存储的是指针变量)的地址,即定义 f 时就指向了一个数组的首地址,而这个数组中的每个指针元素代表了二维数组每一行的首地址。

然后利用循环,对二维指针进行操作,每维申请一个长度为 m 的数组,刚好 new 操作返回的就是一个数组的首地址,就可以赋给 f[i]

int **f = new int*[n];
for (int i = 0; i < n; ++i) {f[i] = new int[m];
}
  • 方法二:利用二维指针,C malloc操作
int **f = (int**)malloc(sizeof(int*) * n);
for (int i = 0; i < n; ++i) {f[i] = (int*)malloc(sizeof(int) * m);
}
  • 方法三:使用数组指针

直接定义个数组指针指向整个二维数组

int (*p)[3] = new int[2][3];
int cnt = 0;
for (int i = 0; i < 2; ++i) {for (int j = 0; j < 3; ++j) {// *(*(p + i) + j) = ++cnt;// std::cout << *(*(p + i) + j) << " \n"[j == 2];p[i][j] = ++cnt;std::cout << p[i][j] << " \n"[j == 2];}
}
  • 方法四:使用C++ vector

声明了等价于 a[n][m] 的数组

vector<vector<int>> a(n, vector<int>(m, 0));

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

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

相关文章

Java实现插入排序算法

插入排序算法 &#xff08;1&#xff09;概念&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应的位置并插入。 &#xff08;2&#xff09;一个通俗的比喻&#xff1a; 插入排序就类似于斗地主时&#xf…

CloudCompare 二次开发(23)——计算两点云之间的放缩倍数

目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare编程实现计算两点云之间的放缩倍数。具体计算原理见:。 二、代码集成 1、mainwindow.h文件public中添加: void doActionComputeScale(); // 计算两点云的放缩倍数2、mainwindow.cpp文件void MainWin…

vue-element使用html2canvas实现网页指定区域(指定dom元素)截图

直接上代码&#xff1a; <template><el-dialog :visible.sync"printDialogVisible" width"1000px" :close-on-click-modal"false" append-to-body><template><div :id"print_content" ref"print_content&q…

Python网络爬虫的基础理解-对应的自我理解误区

##通过一个中国大学大学排名爬虫的示例进行基础性理解 以软科中国最好大学排名为分析对象&#xff0c;基于requests库和bs4库编写爬虫程序&#xff0c;对2015年至2019年间的中国大学排名数据进行爬取&#xff1a;&#xff08;1&#xff09;按照排名先后顺序输出不同年份的前10…

Linux下通过find找文件---通过修改时间查找(-mtime)

通过man手册查找和-mtime选项相关的内容 man find | grep -A 3 mtime # 这里简单介绍了 -mtime &#xff0c;还有一个简单的示例-mtime n Files data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretati…

【已解决】解决Win7虚拟机打开网页报错的情况

因为刚才下载了个虚拟机&#xff0c;同样出现了无法安装VMtools的情况&#xff0c;所以想直接通过虚拟机的浏览器来下载一个补丁&#xff08;因为自己的U盘在虚拟机上面无法识别&#xff0c;应该是太老了Win7&#xff09; 结果发现Win7内置的IE浏览器太拉了。于是向下载一个火…

深度学习记录--神经网络表示及其向量化

神经网络表示 如下图 就这个神经网络图来说&#xff0c;它有三层&#xff0c;分别是输入层(Input layer)&#xff0c;隐藏层(Hidden layer)&#xff0c;输出层(Output layer) 对于其他的神经网络&#xff0c;隐藏层可以有很多层 一般来说&#xff0c;不把输入层算作一个标准…

【ITK库学习】使用itk库进行图像滤波ImageFilter:几何变换:翻转、重采样(未完)

目录 1、itkFlipImageFilter 图像翻转滤波器2、itkResampleImageFilter 重采样图像滤波器 1、itkFlipImageFilter 图像翻转滤波器 该类的主要功能是使输入数据在用户指定的轴上进行翻转。 翻转轴通过函数SetFlipAxes(array) 设置&#xff0c;其中输入是FixArray<bool,Imag…

UML图的各种类型以及软件设计师考试考察的方式

UML建模 前言 常见的UML的类型 UML 比前两题是更难的&#xff08;略高&#xff0c;但是学会就可以了。前两题是&#xff1a;数据流图&#xff0c;数据库的设计&#xff09;&#xff0c;因为UML图有很多类型&#xff1a;用例图&#xff0c;类图与对象图&#xff0c;顺序图&…

3_CSS层叠样式表基础

第3章-CSS层叠样式表基础 学习目标(Objective) 掌握标签选择器的使用掌握类选择器的使用了解id选择器和通配符选择器掌握font属性和color属性的应用 1.HTML的局限性 如果要改变下高度或者变一个颜色&#xff0c;就需要大量重复操作 总结&#xff1a; HTML满足不了设计者的需…

Emacs之dired模式重新绑定键值v(一百三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

uniapp实战 —— 轮播图【数字下标】(含组件封装,点击图片放大全屏预览)

组件封装 src\components\SUI_Swiper2.vue <script setup lang"ts"> import { ref } from vue const props defineProps({config: Object, })const activeIndex ref(0) const change: UniHelper.SwiperOnChange (e) > {activeIndex.value e.detail.cur…

Python——数据容器

数据容器操作的异同点 项目列表list元组tuple字符串str集合set字典dict元素数量支持多个支持多个支持多个支持多个支持多个元素类型任意任意仅字符任意key&#xff1a;除字典外任意类型&#xff1b;value&#xff1a;任意类型下标索引支持支持支持不支持不支持重复元素支持支持…

yarn link使用(npm link)

使用场景 前端开发中&#xff0c;两个项目相互依赖时&#xff0c;使用yarn link(npm link)链接 例如&#xff1a;A项目依赖于本司自己的UI库B&#xff0c;当我们修改了UI库B中的某些代码时&#xff0c;需本地验证后再发布到私服&#xff0c;此时A项目与UI项目B通过yarn link连…

数据可视化:解锁企业经营的智慧之道

在现代企业管理中&#xff0c;数据可视化已经成为了一项重要的工具。它不仅仅是简单地展示数据&#xff0c;更是提供了深入理解数据、做出更明智决策的方法。作为一名可视化设计从业人员&#xff0c;我经手过一些企业自用的数据可视化项目&#xff0c;今天就来和大家聊聊数据可…

数字化升级,智慧医疗新时代——医院陪诊服务的技术创新

在信息技术飞速发展的今天&#xff0c;医疗服务正迎来数字化升级的新时代。本文将探讨如何通过先进技术的应用&#xff0c;为医院陪诊服务注入更多智慧元素&#xff0c;提升患者和家属的医疗体验。 1. 创新医疗预约系统 # Python代码演示医疗预约系统的简单实现 class Medic…

输入框的透明度影响placeholder的透明度怎么解决

有一个需求是需要写如上图所示的输入框。 首先想到的是调整输入的透明度 <div class"inputDiv"><img src"./images/search.png" /><input type"text" class"myInput" placeholder"请输入标题关键字"/> &…

飞天使-linux操作的一些技巧与知识点

命令行光标移动到行首行尾 ctrl a 跳到首 ctrl e 跳到尾/etc/passwd rpm 包格式 RPM&#xff08;Red Hat Package Manager&#xff09;是一种常用的Linux软件包管理系统&#xff0c;它使用特定的命名规则来标识和命名软件包。RPM包的名称格式通常遵循以下规则&#xff1a;…

Qt基础-修改Qt Creator界面字体

Qt Creator设计时字体太小,有时需要自定义一下,本文讲解如何修改Qt Creator界面字体。 一、创建样式文件 创建CSS文件,定义名称为custom-style.css 编写内容: QWidget { font: 12pt "Microsoft YaHei"; }QPlainTextEdit { font: 12pt "Microsoft YaHei&…

FPGA时序分析与约束(0)——目录与传送门

一、简介 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭&#xff0c;似乎只有理解了时序约束才能算是真正入门了FPGA&#xff0c;对于FPGA从业者或者未来想要从事FPGA开发的工程师来说&#xff0c;时序约束可以说是一道躲不过去的坎&#xff0c;所以这个系列我们会详细介…