C/C++指针操作整理

news/2025/3/14 1:11:53/

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.ppmy.cn/news/1263236.html

相关文章

举例C#使用特性排除某些类成员不参与XML序列化和反序列化

在C#中&#xff0c;可以使用 [XmlIgnore] 特性来排除某些类成员不参与XML序列化和反序列化。这个特性告诉XML序列化器忽略被标记的成员。 以下是一个使用 [XmlIgnore] 特性的示例&#xff1a; using System; using System.IO; using System.Xml.Serialization;public class P…

Ubuntu编译文件安装SNMP服务

net-snmp源码下载 http://www.net-snmp.org/download.html 编译步骤 指定参数编译 ./configure --prefix/root/snmpd --with-default-snmp-version"2" --with-logfile"/var/log/snmpd.log" --with-persistent-directory"/var/net-snmp" --wi…

基于OpenCV的人脸识别系统案例

基于OpenCV的人脸识别系统案例 人脸识别简介代码实现案例应用情况 下面将介绍如何使用Python和OpenCV库构建一个简单但强大的人脸识别系统。人脸识别是计算机视觉领域的一个重要应用&#xff0c;具有广泛的实际用途&#xff0c;从安全门禁到娱乐应用。 人脸识别简介 人脸识别是…

GPT-Crawler一键爬虫构建GPTs知识库

GPT-Crawler一键爬虫构建GPTs知识库 写在最前面安装node.js安装GPT-Crawler启动爬虫结合 OpenAI自定义 assistant自定义 GPTs&#xff08;笔者用的这个&#xff09; 总结 写在最前面 GPT-Crawler一键爬虫构建GPTs知识库 能够爬取网站数据&#xff0c;构建GPTs的知识库&#xf…

HarmonyOS开发(九):数据管理

1、概述 1.1、功能简介 数据管理为开发者提供数据存储、数据管理能力。 它分为两个部分&#xff1a; 数据存储&#xff1a;提供通用数据持久化能力&#xff0c;根据数据特点&#xff0c;分为用户首选项、键值型数据库和关系型数据库。数据管理&#xff1a;提供高效的数据管…

四、STM32时钟系统RCC——使用HSE/HSI配置时钟

1. STM32 时钟系统介绍 1.1 STM32 时钟来源 时钟系统相当于 CPU 的脉搏&#xff0c;只有时钟起效了&#xff0c;CPU 才可以跑起来。所有时钟对于 CPU 也是至关重要的。但 STM32 的时钟系统是比较复杂的&#xff0c;51单片机只有一个系统时钟&#xff0c;而 STM32 却有多个时钟…

使用python脚本一个简单的搭建ansible集群

1.环境说明&#xff1a; 角色主机名ip地址控制主机server192.168.174.150受控主机/被管节点client1192.168.174.151受控主机/被管节点client2192.168.174.152 2.安装python和pip包 yum install -y epel-release yum install -y python python-pip 3.pip安装依赖库 pip in…

Docker安装postgres最新版

1. postgres数据库 PostgreSQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是关于PostgreSQL的一些介绍&#xff1a; 开源性&#xff1a;PostgreSQL是一个开源项目&#xff0c;可以…