C++迈向精通:再看C数组与指针

再看C数组与指针

下面这段代码是合法的:

    srand(time(0));int arr[10] = {0};for (int i = 0; i < 10; ++i) {arr[i] = rand() % 100;}for (int i = 0; i < 10; ++i) {cout << i[arr] << endl;}

你能明白是为什么嘛?如果不明白,那么这篇文章将会教会你。

指针与数组

这两个概念其实密不可分。如果不能彻底理解其中一方,就会导致也无法理解另一方。

数组

C语言中的指针有下面两点需要注意:

  • C语言中只有一维数组,而且数组的大小必须在编译期就被确定。但C语言中的元素可以是任意对象。
  • 对于一个数组,我们只能做两件事:确定数组大小、获得该数组下标为0的指针。其他有关数组的操作,都是在上面的指针基础上运行的。因此我们完全可以依赖指针行为来定义数组的下标行为。

指针

指针的一些细节如下:

  • 任何指针都是指向某种类型的变量
  • 如果指针指向的是数组中的一个元素,那么只需要给指针加1,就能够得到指向该数组中下一个元素的指针。同样的,如果我们给这个指针减1,得到的就是指向该数组中前一个元素的指针。

数组与指针的联系

上面的特性暗示了下面的事实:
给指针加上一个整数,与给该指针的二进制表示加上同样的整数,这两者的含义截然不同。
如果指针p指向一个整数,那么p+1指向的是计算机内存中的下一个整数。

如果两个指针指向的是同一个数组中的元素,我们可以把这两个指针相减:

int *q = p + i;

那么我们可以通过 q - p 来得到 i 的值。如果 pq 指向的不是同一个数组中的元素,即使他们所指向的地址在内存中的位置正好间隔一个数组元素的整数倍,所得到的结果仍然无法保证。

数组与指针的转换

数组名代表这个数组第一个元素的地址,
如果我们这样做:

int a[3];
int *p = a; // 将数组第一个元素的地址赋值给指针p

此时p指向数组的第一个元素,因此解引用后就可以访问第一个值:

cout << *p << endl; // 输出a[0]的值

如果想要通过这个指针来访问 a[1] 呢?
只需要在p上向后加1就可以了:

cout << *(p + 1) << endl;   // 输出a[1] 

可以发现:
数组与指针的相互的解释关系是这样的:

a[1] = *(a + 1); // 这里假定a是一个数组首地址

既然如此是不是也可以这样做呢?

1[a] = *(1 + a);

没错!你真的可以这样做,这就是为什么我们开头所给出的那个例子是合法的原因。

多维数组地址转换

将数组中的元素改为数组地址,就得到了一个二维数组:
二维数组的声明方式是这样的:

int a[100][100];

用指针先表示其中的一维是这样的:
假设我们表示 a[50][50]

*(a[50] + 50);

再去掉一维:

*(*(a + 50) + 50);

:wq 拜拜~~~~

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

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

相关文章

HTTP背后的故事:理解现代网络如何工作的关键(二)

一.认识请求方法(method) 1.GET方法 请求体中的首行包括&#xff1a;方法&#xff0c;URL&#xff0c;版本号 方法描述的是这次请求&#xff0c;是具体去做什么 GET方法&#xff1a; 1.GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。 2.在浏览器中直接输入 UR…

算法 —— 快速幂

目录 P1045 [NOIP2003 普及组] 麦森数 P1226 【模板】快速幂 原理I 原理II P1226 代码解析 P1045 代码解析 P1045 [NOIP2003 普及组] 麦森数 本题来自洛谷&#xff1a;P1045 [NOIP2003 普及组] 麦森数&#xff0c;根据题意&#xff0c;我们可以看到本题需要计算最少2的1…

C语言程序设计实验8实验报告

1&#xff0e;实验目的 &#xff08;1&#xff09;掌握循环语句 &#xff08;2&#xff09;学习使用递归 &#xff08;3&#xff09;学习使用程序调试 2&#xff0e;实验内容、算法、流程图及主要符号说明 &#xff08;1&#xff09;用辗转相减求最大公约数的递归定义是&a…

ArkTS学习笔记_自定义组件

自定义组件学习笔记 (一)、自定义组件的基本结构 1、struct:自定义组件基于struct实现 格式: struct + 自定义组件名 + {...}简单示例: @Entry @Component struct Index {// 组件的状态 @State message: string = Hello World// 组件的UI构造方法 build() {Row() {C…

python 读取矢量图svg

在Python中读取矢量图&#xff0c;通常指的是读取如SVG&#xff08;可缩放矢量图形&#xff09;或PDF等格式的文件。对于这些格式的处理&#xff0c;Python有几个库可以做到&#xff0c;如matplotlib、cairo、inkscape的Python接口等。以下是使用matplotlib库读取SVG文件的一个…

基于JAVA的智慧社区信息管理系统设计

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【Android高级UI】PorterDuffMode颜色混合公式

效果展示 色彩混合公式 参数说明 S&#xff0c;源图形D&#xff0c;目标图形A&#xff0c;透明度C&#xff0c;RGB色Saturate&#xff0c;饱和度

js的多线程示例

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>普通worker</title></head><body…

PingRAT:一款基于ICMP的隐蔽型C2流量转发工具

关于PingRAT PingRAT是一款基于ICMP的隐蔽型C2流量转发工具&#xff0c;该工具专为红队成员和攻防演练任务而设计&#xff0c;主要利用了ICMP Payload来实现其功能&#xff0c;该工具不仅能转发C2流量&#xff0c;而且还可以帮助广大研究人员增强C2网络通信流量传输的隐蔽性。…

基于Cpp的OpenCV4.8入门学习笔记(二)

文章目录 前言一、OpenCV图像的一些基本操作&#xff08;day 02&#xff09;16. OpenCV中提供的随机数生成17. 绘制和填充多边形&#xff0c;以五边形为例18. 鼠标事件控制绘画&#xff0c;截取ROI区域19. 图像的像素类型转换与归一化操作20. 图像的放缩与插值21. 图像的翻转&a…

(leecode学习)14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; 输入…

day02.08.成员运算符•二

# 成员运算符&#xff08;掌握&#xff09; # in, not in print(3 in [3,4,5]) # print("name" in "abcnamehaha") # print(name not in {"name": "ikun", "age": 30}) # 身份运算符&#xff08;了解&#xff09; # is…

SWDIO管脚作为GPIO

下面是使用FRDM-K32L2B3开发板和SDK中的frdmk32l2b_gpio_led_output程序做了一些测试&#xff0c;configure SWDIO pin as GPIO pin的流程。 查看手册&#xff0c;找到SWDIO对应的管脚&#xff0c;可以看到PTA3对应的SWDIO管脚。 2.修改Demo程序&#xff0c;在程序中设置SWDIO…

npm和yarn清理缓存命令

yarn清除缓存 1、查看yarn全局缓存目录 yarn cache dir2、清除缓存 yarn cache cleannpm 清除缓存 1、将node-modules文件夹先删除 2、清理缓存命令&#xff1a; npm cache clean --force3、重新安装一次即可 npm install /cnpm install

【杰理蓝牙开发】AC632 开发板烧录实例

AC632 开发板烧录实例 0. 个人简介 && 授权须知1. 硬件板卡介绍2. 代码烧录2.1 使用USB接口烧录2.2 使用串口烧录 3. 为什么要用烧录器供电&#xff1f; 0. 个人简介 && 授权须知 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c…

代码随想录训练营第三十六天 1049最后一块石头的重量II 494目标和

第一题&#xff1a; 原题链接&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先确认这是一道01背包问题的题目&#xff0c;如何转换&#xff1a;剩下尽可能小的重量&#xff0c;如何剩下呢&#xff1f;跟分割等和子集很…

论文略读:LoRA Learns Less and Forgets Less

202405 arxiv 1 主要思想 LORA相比于全参数训练&#xff0c;学的少&#xff0c;但忘的也少 2 实验分析 2.1 训练的表现 在编程和数学任务中&#xff0c;LoRA相比全参数微调表现出明显的劣势 2.2 遗忘的表现 这边的遗忘&#xff0c;是指在数据集A上预训练&#xff0c;然后在…

18.x86游戏实战-找角色人物名字

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

c语言复习

0概念复习 gcc 旨在编译 C 语言代码。g 旨在编译 C 语言代码。 1.定义常用 #define pi 3.14 int m,n,i,sum,k1,count0,t; #include <ctype.h> #include <string.h> 2.函数常用 3.应试回答和八股 char x[5]{a&#xff0c;b&#xff0c;\0&#xff0c;c&#xff0c…

Checkpoint log is not found or is corrupted. Job not submitted.

问题 Checkpoint log is not found or is corrupted. Job not submitted. 解决 这个功能现在LSF需要第三方软件才能支持了&#xff0c;比如通过脚本集成blcr&#xff0c;blcr提供checkpoint&#xff0c;提交作业时-k是必须的&#xff0c;这个参数要设置存放checkpoint log的…