当前位置: 首页 > news >正文

C++学习之指针和数组

指针和一维数组

一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既可以指向变量,当然也可以指向数组元素。所谓数组元素的指针就是数组元素的地址。
eg:

int a[6]; //定义一个整数数组a,它有6个元素
int *p;  //定义一个整型的指针变量 *p
//下述表达等价
p=&a[0];  //将元素a[0]的地址赋给指针p,使p指向a[0]
p=a   //数组名代表数组第一个元素,所以该式与p=&a[0]等价

如果p的初始值是&a[0],则需要注意:
①p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素(如果p已经指向数组中的一个元素了,则p+1指向下一个元素)
②*(p+i)或*(a+i)是p+i或a+i所指向的数组元素的值
③指向数组元素的指针变量也可以带下标,如p[i]和*(p+i)等价

指针和二维数组

首先,定义一个二维数组:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
  1. 上述的二维数组是由3个一维数组构成的,即a数组包含3行:a[0]行,a[1]行,a[2]行,每个一维数组又包含4个数组元素,由此可见二维数组是“数组的数组”
  2. a是数组名,代表二维数组首元素的地址,现在的首元素不是一个整型变量,而是由四个整型元素所组成的一维数组,因此a代表的是首行的起始地址(即第0行的起始地址,&a[0]),a+1代表a[1]行的首地址,即&a[1]
  3. C++规定了数组名代表数组首元素的地址,所以a[0],a[1],a[2]就是一维数组名,所以a[0]相当于&a[0][0],a[1]相当于&a[1][0],a[2]相当于&a[2][0]
  4. 0行1列元素的地址可以直接写为&a[0][1],用指针表示为a[0]+1,所以i行j列的元素的地址用指针表示为a[i]+j
  5. i行j列元素的值用指针表示为*(a[i]+j)或者 *( *(a+i)+j)

字符指针和字符数组

char str[]="I love C++";  //用字符数组存放一个字符串
char *str="I love C++";   //用字符指针指向一个字符串

上述两种方式打印的str结果是一样的。
那他们有什么不同呢?

  1. 存储方式的不同
char str1[]="hello";
char str2[]="hello";

“hello"是一个常量,保存在常量存储区,所以str1并不是数组"hello"的首地址,它只是一个变量,保存在栈中,str2也是在栈中申请了额外的空间保存"hello”,所以这里str1不等于str2。

const char str3[]="hello";
const char str4[]="hello";

使用const定义的变量一般是不分配内存的,而是保存在符号表中。但是对于const数组来讲,系统不确定符号表是否有足够的空间来存放const数组,所以还是为const数组分配内存的,因此str3和str4都各自分配了内存,因而不相等。

const char* str5[]="hello";
const char* str6[]="hello";

这里str5和str6都是指针,保存在符号表上,指向的是常量存储区中的"hello",所以str5=str6。

  1. 赋值方式不同
    对字符指针变量可采用下面的方式赋值,但是字符数组不行,对字符数组只能对各个元素赋值
const char* array;
array="I love C++";  //合法
//下列表述不合法
char str[10];
str="I love C++";
  1. 指针变量的值是可以改变的,但是字符数组名是不能改变的
const char *array="welcome to C++";
array=array+1;  //此时array打印结果为"elcome to C++"

指针数组和数组指针

指针数组:即存储指针的数组,首先它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定。
数组指针:即指向数组的指针,首先它是一个指针,它指向一个数组。

  • 指针数组定义int *p1[10]:首先,[]的优先级比 * 要高,所以p1先与[]结合,构成一个数组定义,数组名为p1。其次,“ int * ”修饰的是数组内容,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址。
  • 数组指针定义int (*p2)[10] :这里()的优先级比[]高,*和p2构成一个指针定义,指针变量名为p2,int修饰的是数组的内容,即数组的每个元素,数组在这里并没有名字,是个匿名数组。所以p2是一个指针,指向一个包含10个int类型数据的数组。

指向指针的指针

指针可以指向一份普通的数据,也可以指向一份指针类型的数据。
eg:

int a=10;
int *p1=&a;
int **p2=&p1

他们的关系如下:
在这里插入图片描述

const指针

const关键字指定了一个不可修改的变量,但并不是常量,它可以使编译器帮助用户定义的某些变量不被意外修改。
(1)指针包含的地址是常量,不能被修改,但可以修改指针指向的数据
eg:

int x=30;
int* const p=&x;
*p=33;  //指向的数据可以更改
int y=28;
p=&y;  //不能更改地址

(2)指针指向的数据为常量,不能修改,但可以修改指针包含的地址,即指针可以指向其他地方

int x=50;
const int* p=&x;
int y=25;
p=&y;  //可以更改指针的地址
*p=20; //不能更改指针指向的数据

注:通过上述一二可以看出,当const在 * 前时,其修饰的是指针指向的内容,但指针本身是可变的,当const在 * 后面时,其修饰的是指针本身,但其指向的内容是可变的。
(3)指针包含的地址以及它指向的值都是常量,不能修改
eg:

int x=12;
const int* const p=&x;  //此时都不能修改

相关文章:

C++学习之指针和数组

指针和一维数组 一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既可以指向变量,当然也可以指向数组元素。所谓数组元素的指针就是数组元素的地址。 eg: int a[6]; //定义一个整数数组a…...

什么是站内搜索引擎?如何在网站中加入站内搜索功能?

在当今数字时代,用户体验对于网站的成功起着至关重要的作用。提升用户体验和改善整体网站性能的一种方法是引入站内搜索引擎。站内搜索引擎是一种强大的工具,它的功能类似于Google或Bing等流行搜索引擎,但它专注于实施自己网站上的内容。用户…...

【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析

在派生类中定义一个虚函数 定义派生类时: 将基类中的虚函数覆盖掉:派生类提供新定义,所声明的函数原型必须完全符合基类所声明的函数原型(包括:参数列表、返回类型、常量性);原封不动继承基类…...

uniapp vue3 静态图片引入

方法一 从新定义路径 一定看好你图片的路径 代码 <template><div class"main">Main<img :src"getImg()" alt""></div> </template><!-- 方式一 // <script setup> // let imgName logo.png // cons…...

仅用61行代码,你也能从零训练大模型

本文并非基于微调训练模型&#xff0c;而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇&#xff0c;你将了解训练出一个大模型的环境准备、数据准备&#xff0c;生成分词&#xff0c;模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…...

Vue3目录结构与Yarn.lock 的版本锁定

Vue目录结构与Yarn.lock 的版本锁定 一、Vue3.0目录结构图总览 举个例子看vue的目录&#xff0c;一开始不知道该目录是什么意思目录里各个文件包里安放有什么&#xff0c;程序员在哪里操作该如何操作。 下图目录看Vue新项目 VS Code 打开文件包后出现一列目录 二、目录结构 1…...

内网渗透之哈希传递

文章目录 哈希传递&#xff08;NTLM哈希&#xff09;概念LMNTLM 原理利用hash传递获取域控RDP 总结 哈希传递&#xff08;NTLM哈希&#xff09; 内网渗透中找到域控IP后使用什么攻击手法拿下域控&#xff1a; 扫描域控开放端口。因为域控会开放远程连接&#xff1a;windows开…...

Haar cascade+opencv检测算法

Harr特征识别人脸 Haar cascade opencv步骤 读取包含人脸的图片使用haar模型识别人脸将识别的结果用矩形框画出来 构造haar检测器 &#xff1a;cv2.CascadeClassifier(具体检测模型文件) # 构造Haar检测器 # 级联分级机,cv2.CascadeClassifier():cv2的内置方法&#xff0…...

跨域请求方案整理实践

项目场景&#xff1a; 调用接口进行手机验证提示,项目需要调用其它域名的接口,导致前端提示跨域问题 问题描述 前端调用其他域名接口时报错提示: index.html#/StatisticalAnalysisOfVacancy:1 Access to XMLHttpRequest at http://xxxxx/CustomerService/template/examineMes…...

Git Pull failure 【add/commit】

操作页面 操作步骤 1. 打开项目所在 在.git目录下右击打开Git Bssh Here 2. git add . 3. git commit -m "提交" 4. 成功提交到本地, 这下就可以拉取代码了...

单链表习题(对应章节chapter2)

题目1&#xff1a;链表的中间结点 题目来源&#xff1a;leetcode链表的中间结点 第一种思路分析&#xff1a;考虑指针移动到相应的位置来做 参考代码&#xff1a;位置&#xff08;/chapter2/c/middle-link-list-node/lc1.cc&#xff09; #include <stdio.h> extern &qu…...

SQL创建新表

表的创建、修改与删除&#xff1a; 1.1 直接创建表&#xff1a;CREATE TABLE [IF NOT EXISTS] tb_name – 不存在才创建&#xff0c;存在就跳过 (column_name1 data_type1 – 列名和类型必选 [ PRIMARY KEY – 可选的约束&#xff0c;主键 | FOREIGN KEY – 外键&#xff0c;引…...

Python视频剪辑-Moviepy视频尺寸和颜色调整技巧

在视频编辑中,尺寸和颜色是两个不能忽视的重要因素。本文将从专业角度深入探讨如何通过MoviePy进行视频尺寸和颜色的调整,以及遮罩透明度的应用。 文章目录 视频尺寸变换函数裁剪视频指定区域裁剪视频像素为偶数视频增加边框缩小、放大视频视频颜色变换函数blackwhite 视频变…...

前端笔记:Create React App 初始化项目的几个关键文件解读

1 介绍 Create React App 是一个官方支持的方式&#xff0c;用于创建单页应用的 React 设置用于构建用户界面的 JAVASCRIPT 库主要用于构建 UI 2 项目结构 一个典型的 Create React App 项目结构如下&#xff1a; ├── package.json ├── public # 这…...

提高工作效率!本地部署Stackedit Markdown编辑器,并实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…...

visual studio解决bug封装dll库

1.速度最大化 O2 2.设置输出目录 配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 3.输出X86 X64分别对应的dll、lib、pdb 然后修改更新说明 更新说明格式如下&#xff1a; 4.将库提交到FTP每日更新库文档下 和测试交接…...

合肥工业大学自然语言处理实验报告

工程报告 目录 1 研究背景 4 2 工程目标 7 2.1 工程一 7 2.2 工程二 7 2.3 工程三 7 2.4 工程四 7 3 实验环境与工具 7 4 模型方法 8 4.1 n-gram模型 8 4.2 模型的平滑 9 4.2.1 Add-one 9 4.2.2 Add-k 9 4.2.3 Backoff 10 4.2.4 Interpolation 10 4.2.5 Absolute discounting 1…...

layui laydate实现日期选择并禁用指定的时间

最终实现禁用2023-9-26这天的效果 官网地址 日期和时间组件文档 - layui.laydate 下面是实现的代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet"…...

scala数组函数合集

目录 1. 添加类函数 2.生成类函数 3.删除类函数 4.查找类函数 5.统计类函数 6.修改类函数 7.判断类函数 8.获取集合元素 9.集合操作类函数 10.转换类函数 11.工具类函数 12.集合内与集合间计算函数 在 scala 中Array数组是一种可变的、可索引的数据集合 创建数组…...

软件测试「转行」答疑(未完更新中)

软件测试行业「转行」答疑&#xff08;未完更新中&#xff09; ⭐文章简介一、2023年「互联网」行业现状&#xff01;二、0基础转行「互联网」的5句大实话建议&#xff01;三、互联网有哪些「职业」&#xff0c;可以选择&#xff1f;四、这些职业之间的优缺点介绍。 ⭐文章简介…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...