C++学习之指针和数组

news2024/9/24 11:31:41

指针和一维数组

一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既可以指向变量,当然也可以指向数组元素。所谓数组元素的指针就是数组元素的地址。
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;  //此时都不能修改

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

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

相关文章

web:[HCTF 2018]admin

题目 点击页面显示如下 点击hctf显示 没有账号,先注册一个 随便注册一个试试看 输入账号密码显示如下 页面没有其他的提示,查看源代码 这里提示不是admin 先注册一个admin账号试一下 显示admin已经被注册了,所以知道用户名为admin&#xff0…

【图像分割】SAM、FastSAM与MobileSAM原理

文章目录 前言:Segment Anything一、FastSAM二、MobileSAM框架实验 总结 前言:Segment Anything Meta 今年发布了图像分割模型 Segment Anything Model (SAM) 。SAM 已经学会了关于物体的一般概念,可以为任何图像或视频中的任何物体生成 mas…

基于共生生物优化的BP神经网络(分类应用) - 附代码

基于共生生物优化的BP神经网络(分类应用) - 附代码 文章目录 基于共生生物优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.共生生物优化BP神经网络3.1 BP神经网络参数设置3.2 共生生物算法应用 4.测试结果…

JDBC-day03(BLOB类型字段,批量插入)

四:操作BLOB类型字段 1.MySQL BLOB类型 在MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。可以用来存储图片,视频等 插入BLOB类型的数据必须使用PreparedStatement&#x…

redis,mongoDB,mysql,Elasticsearch区别

Redis: Redis是一种高性能键值存储数据库,基于内存操作,支持数据持久化,支持数据类型丰富灵活,如字符串、哈希、列表、集合、有序集合等。Redis还提供了订阅/发布、事务、Lua脚本、主从同步等功能,适用于访…

学习记忆——数学篇——案例——代数——函数——一元二次函数

记忆宫殿法 一元二次函数: y a x 2 b x c yax^2bxc yax2bxc a > 0 a>0 a>0,开口向上; a < 0 a<0 a<0,开口向下; x − b 2 a x-\frac{b}{2a…

2023-10-09 python-使用psd_tools-读取psd信息及导出图层图片-记录

摘要: 2023-10-09 python-使用psd_tools-读取psd信息及导出图层图片-记录 相关文档: Usage — psd-tools 1.9.28 documentation 读取psd的信息: py代码: from psd_tools import PSDImagepsd PSDImage.open(example.psd) #psd PSDImage.open(one.psd)print(psd)for layer in …

DirectX C++项目调试时报错:The FX file cannot be complied.

文章目录 遇到的问题错误排除方法经验总结 遇到的问题 在编虚拟现实的课程作业的时候,打算基于上一次的作业项目改一改来交,于是把上次项目的代码复制过来。生成解决方案的过程没有报错,但是在调试该项目时,报错内容如下图所示&a…

vulnhub_clover靶机渗透测试

clover靶机 文章目录 clover靶机信息收集ftp渗透web渗透横线移动权限提升靶机总结 靶机地址:https://www.vulnhub.com/entry/clover-1,687/ 信息收集 使用nmap扫描得到了很对端口,能用的也就是21 22 80三个端口,其他都是关闭的,全…

【开发篇】二十三、SpringBoot Admin端点指标控制以及自定义端点

文章目录 1、info端点指标控制2、health端点指标控制3、metrics端点指标控制4、自定义端点5、补充 接上篇,整合完SpringBoot Admin的客户端和服务端后,在监控页面看到信息栏是空的,但info端点是开放的,这就涉及到端点指标控制。 1…

基于ffmpeg给视频添加时间字幕

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕,字幕的内容为视频所播放的时间(故需要安装ffmpeg,具…

【配置vscode编写python代码并输出到外部控制台】

配置vscode编写python代码并输出到外部控制台 1、扩展中添加python插件 2、打开一个文件夹,在里面新建一个.py文件,粘贴print(‘你好啊!’)并运行 运行结果如下: 3、点击调试点击如下图 生成launch.json,将console后面改成exte…

如何搭建接口自动化测试框架

接口自动化测试框架搭建 一、原理及特点 参数放在XML文件中进行管理 用httpClient简单封装一个httpUtils工具类 测试用例管理使用了testNg管理,使用了TestNG参数化测试,通过xml文件来执行case。 测试报告这里用到第三方的包ReportNG 项目组织用Maven 二、…

在MySQL中使用!=还能走索引吗?

在MySQL中使用!还能走索引吗? 一般情况下,我们会在一个索引上较多的使用等值查询或者范围查询,此时索引大多可以帮助我们极快的查询出我们需要的数据。 那当我们在where条件中对索引列使用!查询,索引还能发挥他的作用吗&#xf…

基于SSM的网上宠物店商城交易系统

基于SSM的网上宠物店商城交易系统~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 详情界面 登录界面 管理员界面 摘要 基于SSM框架的网上宠物店商城交易系统…

Vue-1.8生命周期

Vue生命周期 一个Vue实例从创建到销毁的整个过程。 生命周期: 1)创建:响应式数据 ->发送初始化渲染请求 2)挂载:渲染数据->操作dom 3)更新:数据修改,更新视图 4&#xf…

M4Singer CUDA error: no kernel image is available for execution on the device

操作系统Ubuntu 22.04 2060 上整合好的M4Singer&#xff0c;拷贝到Ubuntu 22.04 4060ti16G上运行报错 Traceback (most recent call last): File "data_gen/tts/bin/binarize.py", line 20, in <module> binarize() File "data_gen/tts/bin/bi…

UDP协议(UDP协议特点 UDP的报文格式 UDP的服务端和客户端代码(简单的步骤))

目录 端口号 UDP协议 UDP协议特点 UDP 无连接 UDP 面向数据报 UDP 全双工 UDP 的报文格式 什么是校验和&#xff1f; 如何基于校验和来完成数据校验呢&#xff1f; CRC算法&#xff08;循环冗余算法&#xff09; MD5算法/SHA算法&#xff08;这里只介绍MD5算…

智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…