c语言指针指向一维数组与二维数组?

author author     2023-04-04     326

关键词:

请问高人,想定义一个指针指向一个一维/二维数组,

(一)
double *a;
double data[3]= 1,2,3;
a = data;

编译正确

(二)
double *a;
double data[3][3] = 1,2,3, 4,5,6, 7,8,9;
a = data;

编译出错:
error #515: a value of type "double (*)[3]" cannot be assigned to an entity of type "double *"

(三)
double data[3][3] = 1,2,3, 4,5,6, 7,8,9;
double *a = data;

编译正确

请问:
(1)(一)中指向一维数组对了,(二)中指向二维数组为什么不对?
(2)(三)和(二)不是一个意思么?为什么一个对一个错?

3和2是一样的,也是会报错的。

可以使用行指针double (*p)[3]=data;指向数组第0行,也就是我们平常理解的第一行。

访问方式,假设data是i行j列,*(*(p+i)+j)就是第i行j列的元素值,也就是data[i][j]的值。

也可以使用列指针double *p = data[0]指向第0行0列,访问方式如下:

追问

不好意思:

“double (*p)[3]=data;指向数组第0行”的说法好像不对?

程序如下:

double data[2][3] = 1, 2, 3, 11, 22, 33;

 double (*p)[3] = data;

将(*a)[3]添加Add Watch运行结果:

(*p)[3]为什么指向了第二行第一列元素11?

且根据“double (*p)[3]=data”这一句的等号左边的意思应当是:y指针*p定义的长度为3?那怎么会有(*p)[3]、(*p)[4]、(*p)[5]?

追答

因为内存是连续分配的,而不是说二维数组就给你分配成二维数组的样子

参考技术A

(三)应该报错的:error: cannot convert ‘double (*)[3]’ to ‘double*’ in initialization.

先回答(2):其实(二)和(三)一个意思,都不正确。(三)在你那里不报错估计是编译器环境的原因。

对于问题(1),在于能否正确理解二维数组名的含义。

二维数组名data表示第0行的地址;*data表示data[0][0]的地址;而**data才表示data[0][0]的值。


可以看一下该博文:二维数组中数组名与其指针的关系

本回答被提问者采纳

c语言指向一维数组元素的指针

本文目录一、用指针指向一维数组的元素二、用指针遍历数组元素三、指针与数组的总结四、数组、指针与函数参数前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量。数组及其数组元... 查看详情

c语言中二维数组行指针是啥

先从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成... 查看详情

多维数组与指针(代码片段)

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素,但在概念和使用上,多维数组的指针比一维数组的指针要复杂一些。可以认为二维数组是数组的数组。例:定义:inta[3][4]=1,2,3,4,5,6,7,8,9,10,11... 查看详情

c语言二级指针作为输入(二维数组|二维数组内存大小计算|指针跳转步长问题)(代码片段)

文章目录一、二维数组内存大小计算二、二维数组内存大小意义一、二维数组内存大小计算给定一个二维数组:该二维数组中有444个一维数组,每个一维数组有101010个char数据;//I.二维数组chararray[4][10]="abc","123","258&... 查看详情

c语言的数组和指针(代码片段)

在C语言中,数组和指针是两个关系密切但也不容易弄清楚的两个概念。本文主要基于一维和二维数组来展示他们的关系,其中关于二维数组的内容也可以适用到多维。本文使用gdb作为交互式的实验工具,在文章的实验展示中以(g... 查看详情

c语言二级指针作为输入(二维数组|二维数组遍历|二维数组排序)(代码片段)

文章目录一、二维数组1、二维数组声明及初始化2、二维数组遍历3、二维数组排序二、完整代码示例一、二维数组前几篇博客中,介绍的是指针数组;指针数组的结构特征是,数组中的每个元素,即每个指针变量可以指向不同大小的... 查看详情

c语言二维数组指针变量是啥,int(*p)[2]啥意思

二维数组指针变量形式如下:类型名(*数组名)[数组行数][数组列数]如:int(*p)[2][3];//定义一个int类型的二维数组指针变量,数组中每个元素都是一个指针int(*p)[2]表示定义一个数组指针,只是是一个一维的数组指针,数组中每个元... 查看详情

c语言如何定义一个二维指针数组?

定义二维指针数组与定义一维指针数组差不多,只是矩阵的维度增加了一维而已。下面通过具体的实例来说明如何定义一个二维数组int *p[2][3];  // 定义一个二维数组,只是定义,并没有分配地址空间int i,j; ... 查看详情

c语言基础:c中数组详解(多维数组传递数组给函数从函数返回数组指向数组的指针)(代码片段)

01:C语言基础:数组(声明数组、初始化数组、访问数组元素)02:C语言基础:C中数组详解(多维数组、传递数组给函数、从函数返回数组、指向数组的指针)1.C中数组详解在C中,数组是非常... 查看详情

C中二维数组的名称

...时间】:2019-02-2503:29:52【问题描述】:我正在学习C中的指针和数组,这是一个让我困惑了一段时间的问题:因此,一维int数组的名称是一个指向int的常量指针,它指向该数组中的第一个元素。因此,当我们评估一维数组的名称... 查看详情

c语言如何表示二维数组里面有#

c语言如何表示二维数组里面有#,说明:常用的有以下几种二维数组的表示方法:第一种是普通的二维数组的表示方法。第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内... 查看详情

c语言,指针问题

int*p[100]和int(*p)[100]分别是什么意思呢?详细点最好还有这个,typedefint(*type1_t)(constchar*,int)和typedefinttype2_t(constchar*,int)是什么意思啊(1)int*p[100]是一个指向int型的指针数组,即:p是包含100元素的指针数组,指针指向的是int型。它可以... 查看详情

详解c语言指针(代码片段)

文章目录1.字符指针2.指针数组3.数组指针3.1数组指针的定义3.2&数组名和数组名的区别3.3数组指针的使用4.数组参数,指针参数4.1一维数组传参4.2二维数组传参4.3一级指针传参4.4二级指针传参5.函数指针6.函数指针数组7.指向... 查看详情

c++入门基础教程:c语言的指针与结构体到底怎么用?(代码片段)

目录一、前言二、指针2.1指针与地址2.2指针与函数参数2.3指针与数组2.3.1指针与一维数组2.3.2 指针与二维数组2.4 字符指针与函数2.5 指针数组以及指向指针的指针2.5.1指针数组2.5.2指向指针的指针2.6 指向函数的指针三、结构体3.... 查看详情

c语言二级指针作为输入(自定义二级指针内存|二级指针排序|通过交换指针指向的内存数据方式进行排序)(代码片段)

...交换指针指向的内存数据方式进行排序)在上一篇博客【C语言】二级指针作为输入(二维指针|为二维指针分配内存-存放一维指针|为每个一维指针分配内存|释放二维指针内存)基础上,对二维指针指向的若干一维指针指向的数据进行... 查看详情

关于c语言二维数组列指针初始化

关于c语言二维数组列指针初始化下图关于那个列指针的初始化有不懂。p=a[0],p=*a,p=&a[0][0]。书上说这三者等价,但是我有点不懂。1.按照指针初始化的定义,int*p=&a[0][0];这一点,完全没问题,就算传了二维数组的首地址给指针... 查看详情

数组参数和指针参数

1.C语言中只会以值拷贝的方式传递参数2.当向函数传递数组时,将数组名看做常量指针传数组首元素地址3.二维数组参数同样存在退化的问题,二维数组可以看做是一维数组,二维数组中的每个元素是一维数组4.二维数组参数中第... 查看详情

《c语言程序设计》指针(代码片段)

记录学习过程中的知识点文章目录一、指针引用数组1.1数组与指针1.2多维数组与指针1.2.1多维数组元素的地址1.2.2指向多维数组元素的指针变量1、指向数组元素的指针变量2、指向由m个元素组成的一维数组的指针变量3、指向数组... 查看详情