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

article/2025/8/21 21:00:55

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

这是我一开始犯的错误,完全忘记了野指针这回事:

#include<stdio.h>
#define N 3
int main(void)
{int (*a)[N]=             //不能这么做,这是一个二维数组指针,指针指向的是一个二维数组,定义一个指针需要有地址,这样写有些编译器都通不过{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},};
}

正确的操作方法如下:

#include<stdio.h>
#define N 5
void show(int (*p)[N]);
int main(void)
{int a[][N]=             {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},};int (*p)[N]=a;  //指向一个二维数组的指针。注意,在定义数组指针的时候必须要有()括号,*p[N]的意思是指针数组,p这个数组的每个元素都是一个int*。//其根本原因在于*的计算优先度小于[]show(p);
}void show(int (*p)[N])  //参数的传递有多种方法,下面会帖出其他方法。
{int i;int j;for(i=0;i<3;i++){for(j=0;j<N;j++){printf("%d  ",*(*(p+i)+j));}printf("\n");}
}

输出:

关于参数传递:

//有这两种形式
void show(int (*p)[N]);  //进行参数传递时,列的个数必须是已知
void show(int p[][N]);   //进行参数传递时,列的个数必须是已知//你也可以省略形参名
void show(int (*)[N]);
void show(int [][N]);

其中

void show(int (*p)[N]);//p是一个指针,它指向了一个数组。(数组内部有4个int类型的值)void show(int p[][N]); //空的[]表明p是一个指针,因此上下是等价的

关于二维数组的地址,以及指针的解引用

void show(int (*p)[N])
{int i;int j;for(i=0;i<3;i++){for(j=0;j<N;j++){printf("%d  ",*(*(p+i)+j));    //这是什么?}printf("\n");}
}

二维数组的输出有多种形式,最常见最不容易搞错的就是老老实实

printf("%d",a[i][j]);

但我都困惑这么久了,总不可能只用着一个方法吧,学了这么久总得用上!

于是来看地址:

#include<stdio.h>
#define N 4
int main(void)
{int i,j;int a[][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},};printf("%p\n",a);printf("%p %p\n",&a[0],a[0]);printf("%p\n",*a);printf("%p\n",**a);
}

这是结果:

为什么输出a  *a会是一个地址呢?后面这个**a又是什么鬼?

可以这么理解:把(*a)中的a看成一个行指针,它指向的是数组的行,而后面的[N]则指向了列。(要注意的是,这个N仅仅代表行的长度,如果你在运算的时候不慎使用了这个N,结果将会指向下一行!)

数组连续存放在地址中,这么画是因为看着方便,更容易理解

为什么*a和a和a[0]输出结果是一致的呢?(实际上的含义并不相同)

*a应该这么写:(*(a+0)+0) 代表第0行第0个元素的地址

a应该这么写:(a+0) 代表第0行的首地址,也就是所谓的行指针

a[0]代表第0行首元素地址

那么:

由此也可知,其实每一行的首地址都差了四个int也就是4*4=16的字节,移动行指针就会跳过后面的三个地址,指向下一行的首地址。

所以所谓的列指针,实际上是在首地址后的三个地址间移动!

三角形所指向的就是二维数组每一行的首地址 

那么我们就可以这么理解了

*(a+0)指向的是一个数组,里面存放了四个地址,而改变a,就会指向另外一个存放了四个地址的数组,步长为4*4=16字节。需要这么写:*(a+i);

(*(a+0)+0)指向的是数组里的元素,也就是*a所含有的四个地址,改变二级指针,就会在这个一级指针的数组里移动,步长为4字节。需要这么写(*(a+i)+j);

它等价于

             (*(a+i))[j];

代表他是第 i 行第 j 个数

所以**a就是*(*(a+0)+0),就是二维数组的值

下面是一个程序,通过参数传递来修改指针所指向的内容,从而把二维数组a的值赋给b

#include<stdio.h>
#define N1 3
#define N2 5
void f(int (*a)[N2],int (*p)[N2]);
void show(int (*p)[N2]);
int main(void)
{   int a[N1][N2]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},};int b[N1][N2];int (*p)[N2]=b;f(a,p);show(b);
}
void f(int (*a)[N2],int (*p)[N2])
{int i;int j;for(i=0;i<N1;i++){for(j=0;j<N2;j++){*(*(p+i)+j)=*(*(a+i)+j);}}
}void show(int (*p)[N2])
{int i;int j;for(i=0;i<N1;i++){for(j=0;j<N2;j++){printf("%d  ",*(*(p+i)+j));}printf("\n");}
}

下面是一段总结,方便理解:

(网友:尘落曦枫  总结)

a代表0行地址
&a代表整个数组首地址   正好等于首行首地址
*a表示0行首地址
a+1代表第0+1行地址**a首行首地址元素  (双重解引用:第一重确定首地址;第二重确定元素值)*a代表第0行首地址
*(a+1)代表第0+1行首地址
*(a+2)代表第0+2行首地址a[i]代表第i行元素首地址,等价于*(a+i)
a[i][j]
**a ==*(a[i])    表示i行首地址元素,等价于 *(a+i)
a[0] == *a   表示0行首地址&a代表整个数组的首地址
&a+1代表该数组下一个元素的下个位置的地址*(a+i)+j 代表的是地i行第j个元素(也就是数组中的一个地址)  *a+1代表第0行第1个元素
*(a+1)+1代表第1行第1个元素


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

相关文章

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

静态二维数组与指针 我们定义一个二维数组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_…

12.UniT:Multimodal Multitask Learning with a Unified Transformer

1.动机 UniT&#xff0c;它通过统一transformer联合学习跨不同领域的多个任务。我们的UniT模型可以同时处理8个数据集上的7个任务&#xff0c;从对象检测到视觉和语言推理以及自然语言理解&#xff0c;同时通过紧凑的模型参数集实现每个任务的强大性能。 我们提出了一个统一的t…

Flow Prediction in Spatio-Temporal Networks Based on Multitask Deep Learning(TKDE2020)

Flow Prediction in Spatio-Temporal Networks Based on Multitask Deep Learning&#xff08;TKDE2020&#xff09; 摘要&#xff1a;预测交通流(如车辆、人群和自行车的交通)&#xff0c;包括在一个节点的进出交通和不同节点之间的过渡&#xff0c;在交通运输系统的时空网络…

GPT2.0语言模型 Language Models are Unsupervised Multitask Learners

论文链接&#xff1a;https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf Tensorflow代码链接&#xff1a;https://github.com/openai/gpt-2 Pytorch代码链接&#xff1a;https://github.com/huggingface/pytorch-pretrained-BERT 参考文档&…

论文阅读《Language Models are Unsupervised Multitask Learners》

论文地址&#xff1a;《Language Models are Unsupervised Multitask Learners》 代码地址&#xff1a;https://github.com/openai/gpt-2 文章目录 论文介绍模型框架实验分析结论 论文介绍 本文将常识推理和情感分析两项任务联系起来&#xff0c;采取更一般的方法。证明了语言…

MulT: An End-to-End Multitask Learning Transformer 多任务共享注意力

文章 同时学习多个高级视觉任务&#xff0c;包括深度估计、语义分割、reshading表面法线估计、2D 关键点检测和边缘检测。 与单个任务Transformer相比&#xff0c;跨任务联合培训的Transformer模型能否提高每个任务的性能&#xff1f;在基于Transformer的框架中&#xff0c;可…