二维数组与二级指针

article/2025/8/21 20:56:30

关于二维数组与二级指针那些你必须知道的事

  • 首先,来看一个例子
  • 一个error
  • 嗯,我是解析
    • 指针数组与数组指针

首先,来看一个例子

#include <iostream>using namespace std;int main(void)
{int **p;p=new int*[5];for(int i=0;i<5;i++){p[i]=new int[5];}return 0;
}

  不严格地说(等下细讲),以上代码实现了一个二维数组,我们在访问其中某一个元素的时候,就可以使用p[x][x]的形式来实现;相信聪明的大家不难看出,其实现原理是首先定义一个二级指针使它指向一个 指针数组 ,然后使用循环依次让指针数组里面的指针指向一片int类型的数组,大概是这样的:
在这里插入图片描述
  这样的数据结构不仅仅可以实现二维数组的功能,还可以实现"不等长"数组(每个一级指针申请的空间大小不全一样),如此具有迷惑性外表的二级指针,让我很久以来认为二维数组的数组名不过是一个二级指针,而传统的二维数组只不过编译器限制二级指针指向的 指针数组 中的指针元素所指向的空间大小必须是一样的。

一个error

  某一天,我在函数传参的时候,将一个二维数组作为实参传递,把形参写作二级指针,代码大概是这样的:

#include <iostream>using namespace std;void demo(int **array)
{return;
}int main(void)
{int array[5][5];demo(array);return 0;
}

然后…
“[Error] cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void demo(int**)’”

嗯,我是解析

  先说结论:二维数组名不是二级指针,而是一个数组指针
  关于二级指针,其实就是指向指针的指针,在上面我用二级指针指向一个 指针数组 是合法的,其值就是 指针数组 第一个元素的地址,而第一个元素是一个指针,那么就是指向指针的地址,在通过下标找寻元素的时候,其实质是先找到所谓"行"(找到一个指针),然后通过第二个下标找到该指针指向的第几号元素完成索引。
在这里插入图片描述
  那么二维数组名是什么呢?
  在error部分我们需要将代码修改成这样便可以正常运行:

#include <iostream>using namespace std;void demo(int (*array)[5])//修改的这里 
{return;
}int main(void)
{int array[5][5];demo(array);return 0;
}

  应证了上面的结论
  在c/c++中,多维数组的构成其实是通过数组嵌套构成更高维的数组,比如,二维数组中每一个元素都是一个一维数组,五维数组的每一个元素都是一个四维数组,那么,数组名是指向首元素的指针,于是二维数组名就是一个指向一维数组的指针(int (*a)[x]),同样的,多维数组名其实就是一个指向维度-1的数组指针(int(*a)[x][x][x]…)。

指针数组与数组指针

  指针数组与数组指针根本区别原因是:C语言中,[]运算符优先级大于*运算符优先级
  指针数组是一个数组,这个数组的每一个元素都是一个指针。
  数组指针是一个指针,这个指针指向的是 一个数组 这里要注意的是,是指向整个数组,而不是指向数组的第一个元素,否则就与二维数组名不是二级指针矛盾,数组指针大概是这样的:
在这里插入图片描述
  我们在定义一个数组指针的时候,必须指定其所指向的数组的宽度,这样在数组指针进行行变换的时候编译器就知道该跨越多少个元素去找到所期望的哪一行数组(数组是一片连续的存储空间,这里抽象成为一个矩阵)。
  最后一个例子:int (*a)[5],a代表了一个指向拥有5个元素的数组,那么a[2][3]就是告诉编译器,我要找到一个地址从首元素跨越2x5+3个sizeof(int)的那个元素。
在这里插入图片描述
  写在最后:目前很多c语言教材将二维数组名直接抽象为一个二级指针,这种做法也许便于理解,但是却不是真正的答案。
在这里插入图片描述
本文仅个人观点,如有错误,感谢指正!

越是接近真理,便愈加发现真理的迷人。


http://chatgpt.dhexx.cn/article/FWRKvdJc.shtml

相关文章

C语言二维数组指针用法

目录 题目 背景概念梳理 一维线性 数组指针 指针步长 数组名与指向其的指针变量名等价 数组的初始化与取元素 数组指针转换关系 解题过程 选项A&#xff1a;* (( * prt1)[2]) 选项B&#xff1a;* ( * (p5)) 选项C&#xff1a;( * prt1)2 选项D&#xff1a; * ( * (…

二维数组指针表示,C语言指针引用二维数组详解

指针变量可以指向一维数组中的元素&#xff0c;当然也就可以指向二维数组中的元素。但是在概念和使用方法上&#xff0c;二维数组的指针比一维数组的指针要复杂一些。要理解指针和二维数组的关系首先要记住一句话&#xff1a;二维数组就是一维数组&#xff0c;这句话该怎么理解…

C语言二维数组指针(指向二维数组的指针)详解

声明&#xff01;本文转载仅为方便学习使用&#xff01; 如有需要&#xff0c;请访问C语言指针数组&#xff08;数组每个元素都是指针&#xff09;详解C语言二维数组指针&#xff08;指向二维数组的指针&#xff09;详解 二维数组在概念上是二维的&#xff0c;有行和列&#x…

c语言 二维数组指针

文章目录 前言一、二维数组指针的定义&#xff1a;二、二维数组指针遍历数组元素&#xff1a;总结 前言 前面我们讲了一维数组指针&#xff0c;今天我们讲一下二维数组指针。 一、二维数组指针的定义&#xff1a; 概述&#xff1a; 二维数组指针的定义就是把一维数组换成二维…

关于二维数组,二维数组指针

最近学习指针&#xff0c;一不小心就掉进了二维数组指针的坑里面&#xff0c;在迷惑了接近一个星期后&#xff0c;我有了以下的总结。&#xff08;希望有大佬看见了能指点指点&#xff0c;我也不知道这么理解到底对不对&#xff0c;虽然我觉得是对的&#xff09; 这是我一开始…

二维数组与指针的关系详解

静态二维数组与指针 我们定义一个二维数组int a[4][3]。 二维数组实际是由多个一维数组组成&#xff0c;在这里&#xff0c;a[3][4]就是由3个长度为4的一维数组组成的二维数组。并且它们在空间上是连续的&#xff0c;相当于一个长为12的一维数组。 这里a&#xff0c;a[i]全部…

二维数组与指针(详解)

如果对字符串和二维数组有基本概念可以直接跳去看他们的关系及使用 于4.3 00:08修改&#xff0c;改正了之前文章中错误的观点&#xff0c;修改了一些低级错误 欢迎大家在文章下留言 于21-05-19 22:37再次更新,前几天有个同学问了我这么个问题&#xff0c;我觉得是一个非常好的…

C/C++二维数组指针(指向二维数组的指针)详解

多维数组与指针 用指针变量可以指向一维数组中的元素&#xff0c;也可以指向多维数组中的元素。1) 多维数组元素的地址 设有一个二维数组 a&#xff0c;它有 3 行 4 列。它的定义为&#xff1a; int a[3][4]{{1,3,5,7},{9,11,13,15},{17,18,21,23}}; a 是一个数组名。a 数…

C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)

哈喽&#xff01;这里是一只派大鑫&#xff0c;不是派大星。本着基础不牢&#xff0c;地动山摇的学习态度&#xff0c;从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段找到好的方法、路线&#…

多任务Multitask Learning

一次只学习一个任务&#xff0c;大部分机器学习都属于单任务学习。 多任务学习&#xff1a;把多个相关的任务放在一起学习&#xff0c;同时学习多个任务。 对于复杂的问题&#xff0c;可以分解为简单的相互独立的子问题来解决&#xff0c;然后再合并结果&#xff0c;得到最初复…

Distral: Robust multitask reinforcement learning.

作者&#xff1a;张楚珩 链接&#xff1a;https://zhuanlan.zhihu.com/p/51091244 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 中Distral是Distill & transfer learning的缩写。 原文传送门 Teh, Yee, et…

论文阅读笔记--Clustered Federated Learning:Model-Agnostic Distributed Multitask Optimization Under Privacy

Introduction 传统的Parameter Server&#xff08;P-S&#xff09;架构的联邦学习系统尝试训练出一个模型&#xff0c;让它能适用于每一个client的数据分布&#xff0c;这暗含了一个假设&#xff0c;模型的最优解 θ ∗ \theta^* θ∗同时是所有client的最优解&#xff0c;各个…

CVPR 2021 UniT: Multimodal Multitask Learning with a Unifified Transformer

动机 transformer在包括但不限于自然语言、图像、视频和音频在内的广泛领域都显示出巨大的成功。 前人的研究表明,在大型语料库中训练的transformer在一系列的下游语言任务中学习了强大的表征。在视觉领域中,基于transformer的模型在图像分类、目标检测和全景分割方面取得了非…

Language Models are Unsupervised Multitask Learners 笔记

语言模型是无监督的多任务学习者 摘要 自然语言处理任务&#xff0c;如问题回答、机器翻译、阅读理解和总结&#xff0c;通常是通过任务特定数据集上的监督学习来完成的。我们证明&#xff0c;当语言模型在一个称为WebText的数百万网页的新数据集上训练时&#xff0c;它们可以…

GPT2.0 Language Models are Unsupervised Multitask Learners 论文解读

转载请注明出处&#xff0c;原文地址 本文是对《Language Models are Unsupervised Multitask Learners》的翻译&#xff0c;部分内容可能会存在理解错误&#xff0c;如有错误欢迎指正交流。 个人对论文的理解 最近GPT-2的关注度很高&#xff0c;其效果极其惊人&#xff0c;…

【论文阅读】强化学习-Transfer and Multitask RL专题8篇

文章目录 什么是Transfer and Multitask RLProgressive Neural Networks, Rusu, et al, 2016. Algorithm: Progressive Networks.Universal Value Function Approximators, Schaul et al, 2015. Algorithm: UVFA.Reinforcement Learning with Unsupervised Auxiliary Tasks, Ja…

论文阅读 decaNLP -- The Natural Language Decathlon: Multitask Leaning as Question Answering

作为一个刚刚入门NLP的学生&#xff0c;希望在阅读每一篇论文后都进行一定的记录&#xff0c;提炼文中观点&#xff0c;写出自己的理解&#xff0c;如有任何解读错误之处敬请指出&#xff0c;&#xff2f;&#xff08;∩&#xff3f;∩&#xff09;&#xff2f;谢谢&#xff01…

Recommending What Video to Watch Next: A Multitask Ranking System

文章目录 总结细节实验 总结 魔改mmoewide&deep 细节 mmoewide&deep 分成2个阶段&#xff1a;获得candidates、ranking&#xff0c;ranking时用point-wise ranking时&#xff0c;用w&d获取浅层feature&#xff0c;用于移除position bias ranking model&#x…

《BDD100K: A Diverse Driving Dataset for Heterogeneous Multitask Learning》论文阅读笔记

论文链接 A Diverse Driving Dataset for Heterogeneous Multitask Learning Abstract 介绍了BDD100K数据集&#xff0c;包含100K段视频以及10种类型的任务&#xff0c;针对这种多元化任务需要特殊的训练策略。 1 Introduction ImageNet、COCO等数据集在之前很长一段时间里…

multitask-graph-attention(一)

多任务图注意力框架预测药物毒性&#xff0c;原文&#xff1a;Mining Toxicity Information from Large Amounts of Toxicity Data&#xff0c;代码&#xff1a;MGA&#xff0c;文章从 MGA/interpretation/Ames_interpret.ipynb 开始 文章目录 1.build_dataset1.1.load_graph_…