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

article/2025/8/21 21:04:06

多维数组与指针

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。

1) 多维数组元素的地址
设有一个二维数组 a,它有 3 行 4 列。它的定义为:
    int a[3][4]={{1,3,5,7},{9,11,13,15},{17,18,21,23}};
a 是一个数组名。a 数组包含 3 行,即 3 个元素:a [0],a [1],a [2]。而每一元素又是一个一维数组,它包含 4 个元素 (即 4 个列元素),例如,a [0] 所代表的一维数组又包含 4 个元素: a [0][0], a [0][1], a [0][2], a [0][3],如图所示。可以认为二维数组是 “数组的数组”,即数组 a 是由 3 个一维数组所组成的。
 

从二维数组的角度来看,a 代表二维数组首元素的地址,现在的首元素不是一个整型变量,而是由 4 个整型元素所组成的一维数组,因此 a 代表的是首行的起始地址 (即第 0 行的起始地址,&a [0]),a+1 代表 a [1] 行的首地址,即 & a [1]。

a [0],a [1],a [2] 既然是一维数组名,而 C++ 又规定了数组名代表数组首元素地址,因此 a [0] 代表一维数组 a [0] 中 0 列元素的地址,即 & a [0][0]。a [1] 的值是 & a [1][0],a [2] 的值是 & a [2][0]。
 

0 行 1 列元素的地址可以直接写为 & a [0][1],也可以用指针法表示。a [0] 为一维数组名,该一维数组中序号为 1 的元素显然可以用 a [0]+1 来表示。

欲得到 a [0][1] 的值,用地址法怎么表示呢?既然 a [0]+1 是 a [0][1] 元素的地址,那么,*(a [0]+1) 就是 a [0][1] 元素的值。而 a [0] 又是和 *(a+0) 无条件等价的,因此也可以用 *(*(a+0)+1) 表示 a [0][1] 元素的值。依此类推,*(a [i]+j) 或 *(*(a+i)+j) 是 a [i][j] 的值。
 

2) 指向多维数组元素的指针变量
① 指向数组元素的指针变量
【例1】输出二维数组各元素的值。这里采用的方法是用基类型为整型的指针变量先后指向各元素,逐个输出它们的值。(三种方法均可)

#include <iostream>
using namespace std;
int main()
{int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };//p是基类型为整型的指针变量//p = a[0]  等同于 p = &a[0][0];  也即0行首元素的地址int* p;                              for (p = a[0]; p < a[0] + 12; p++)cout << *p << " ";for (int i = 0;i<3;i++){for (int j = 0;j<4;j++){//cout << *(*(a + i) + j) << " ";cout << *(a[i] + j) << " ";}}cout << endl;return 0;
}

关于指向数组元素的指针变量的几点说明:

  • p 是指向整型数据的指针变量,在 for 语句中对 p 赋初值 a [0],也可以写成 “p=&a [0][0]”。
  • 循环结束的条件是 “p<a [0]+12”,只要满足 p<a [0]+12,就继续执行循环体。
  • 执行 “cout<<*p;” 输出 p 当前所指的列元素的值,然后执行 p++,使 p 指向下一个列元素。

②指向由 m 个元素组成的一维数组的指针变量

可以定义一个指针变量,它不是指向一个整型元素,而是指向一个包含 m 个元素的一维数组。这时,如果指针变量 p 先指向 a [0](即 p=&a [0]),则 p+1 不是指向 a [0][1],而是指向 a [1],p 的增值以一维数组的长度为单位。

【例2】输出二维数组任一行任一列元素的值。

#include <iostream>
using namespace std;
int main( )
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int (*p)[4],i,j;cin>>i>>j;p=a;cout<<*(*(p+i)+j)<<endl;return 0;
}

由于执行了 “p=a”,等同于"p = &a[0] "使 p 指向 a [0]。因此 p+2 是二维数组 a 中序号为 2 的行的起始地址 (由于 p 是指向一维数组的指针变量,因此 p 加 1,就指向下一个一维数组)。*(p+2)+3 是 a 数组 2 行 3 列元素地址。*(*(p+2)+3) 是 a [2][3] 的值。

3) 用指向数组的指针作函数参数
一维数组名可以作为函数参数传递,多维数组名也可作函数参数传递。

【例3】输出二维数组各元素的值。题目与例1相同,但本题用一个函数实现输出,用多维数组名作函数参数。

#include <iostream>
using namespace std;
int main( )
{void output(int (*p)[4]);  //函数声明 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};output(a);  //多维数组名作函数参数return 0;
}//相当于  p = a;或者 p = &a[0];
void output(int (*p)[4])  //形参是指向一维数组的指针变量
{int i,j;for(i=0;i<3;i++)for(j=0;j<4;j++)cout<<*(*(p+i)+j)<<" ";cout<<endl;
}

指针数组和二维数组指针的区别

指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:

int *(p1[5]); //指针数组,可以去掉括号直接写作int *p1[5]; int (*p2)[5]; //二维数组指针,不能去掉括号

指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在 32 位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。

二级指针

使用二级指针初始化一级指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum
{Success,NameErr,SexErr,StrNumErr,ScoreErr
};
typedef struct stu
{char *name;char *sex;char *strNum;float *score;
}STU;
int init(STU ** p)
{*p = (STU *)malloc(sizeof(STU));//*p就是ps,申请一块空间里面存放4个不同类型的指针,将首地址赋值给ps//初始化一级指针,使这4个不同类型的指针都有所指向(*p)->name = (char *)malloc(sizeof(100));if((*p)->name == NULL)return NameErr;(*p)->sex = (char *)malloc(sizeof(char));if((*p)->sex == NULL)return SexErr;(*p)->strNum = (char *)malloc(sizeof(30));if((*p)->strNum == NULL)return StrNumErr;(*p)->score = (float *)malloc(sizeof(float));if((*p)->score == NULL)return ScoreErr;return Success;
}
int main(void)
{STU * ps = NULL;int ret = init(&ps);if(ret != Success)return -1;strcpy(ps->name,"wahaha");*(ps->sex) = 'x';strcpy(ps->strNum,"语文");*(ps->score) = 66.5;printf("姓名:%s\n性别:%c\n科目:%s\n分数:%.2f\n",ps->name,*(ps->sex),ps->strNum,*(ps->score));return 0;
}

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

相关文章

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;可…

Paper | Multitask learning

目录 1. MTL的定义2. MTL的机制 2.1. Representation Bias2.2. Uncorrelated Tasks May Help&#xff1f;3. MTL的用途 3.1. Using the Future to Predict the Present3.2. Time Series Prediction3.3. Using Extra Tasks to Focus Attention3.4. Quantization Smoothing3.5. S…

GPT2(Language Models are Unsupervised Multitask Learners)论文阅读

1. 论文阅读 论文地址&#xff1a;Language Models are Unsupervised Multitask Learners 1.1 背景介绍 2019年OpenAI发布的模型&#xff0c;OpenAI在2018年的GPT1中给出了一种半监督的训练方法&#xff0c;在GPT2中针对如下问题做了升级&#xff1a; 以前机器学习训练代价大…

#Paper Reading# Language Models are Unsupervised Multitask Learners

论文题目: Language Models are Unsupervised Multitask Learners 论文地址: https://life-extension.github.io/2020/05/27/GPT技术初探/language-models.pdf 论文发表于: OpenAI 2019 论文所属单位: OpenAI 论文大体内容&#xff1a; 本文主要提出了GPT-2&#xff08;Gener…