鱼C论坛

 找回密码
 立即注册
查看: 1386|回复: 8

[已解决]在步长相等的情况下,二维数组为什么不能赋值给指向指针的指针?

[复制链接]
发表于 2021-2-2 18:15:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

在步长相等的情况下,二维数组为什么不能赋值给指向指针的指针?
例如:
int array[1][1] = {100};

int **p = array; //这是错误的,
int *pp = array[0]; //这是正确的。


错误的那个步长不是都一样吗?

我感觉我掉坑里了
最佳答案
2021-2-2 19:53:37
二者类型不一样
**p是int类型指针的指针
array是二维数组,也可以称之为数组指针,但不是指针的指针
int array[1][1] = {100};
int (*p)[1]=array;//这样写是对的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-2 19:04:51 | 显示全部楼层
这点我也不懂,来学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-2 19:53:37 | 显示全部楼层    本楼为最佳答案   
二者类型不一样
**p是int类型指针的指针
array是二维数组,也可以称之为数组指针,但不是指针的指针
int array[1][1] = {100};
int (*p)[1]=array;//这样写是对的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-3 04:19:35 | 显示全部楼层
二级指针只能指向指针变量,数组名不是指针变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 15:57:58 | 显示全部楼层
sunrise085 发表于 2021-2-2 19:53
二者类型不一样
**p是int类型指针的指针
array是二维数组,也可以称之为数组指针,但不是指针的指针

但是它们步长不是一样的吗?我特意写的array[1][1];就是没写array[3][4];

一维数组需要一层解引用,
例如:
int str[] = {1, 2, 3, 4, 5};
可以是: int *q  = str;
也可以是: int (*q)[5] = &str;

我想说的意思是数组指针我也懂,但是二维数组的数组指针不是也要两次解引用吗?为什么就是不可以。。。。
类型都是一个地址啊,步长在array[1][1]这个二维数组里也一样啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 16:46:22 | 显示全部楼层
You-Name 发表于 2021-2-3 15:57
但是它们步长不是一样的吗?我特意写的array[1][1];就是没写array[3][4];

一维数组需要一层解引用,

这与步长关系不大,主要是类型不一样啊!!
类型不一样,不能任意赋值啊!!

一米长的钢铁可以和一米长的钢铁焊接在一起,但是你能把一米长的钢铁和一米长的棉绳焊在一起么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 17:10:53 | 显示全部楼层
sunrise085 发表于 2021-2-3 16:46
这与步长关系不大,主要是类型不一样啊!!
类型不一样,不能任意赋值啊!!

这解释
额。。数组指针也是一种类型吗?
数组和指针难道不是一个不是左值,一个是左值只有这点不一样吗?????

是不是这样理解好理解一些?如下:
         在array[1][1]中,该指针类型为int(*)[1],步长为sizeof(array) = 4 * 1 * 1 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)
         在array[3][4]中,该指针类型为int(*)[4],步长为sizeof(array) = 4 * 3 * 4 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)

您看下我理解的类型和步长对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 13:22:40 | 显示全部楼层
You-Name 发表于 2021-2-3 17:10
这解释
额。。数组指针也是一种类型吗?
数组和指针难道不是一个不是左值,一个是左值只有这 ...


问题越讨论越清晰
知识点越讨论越深刻
但是前提是你需要对基本的知识点有了解,才能深入的讨论啊

1、你先弄明白什么是指针,什么是数组,什么是数组指针,什么又是二级指针
有些情况下指针和数组的确可以相互换着使用,但那是有条件的。一级指针有事可以和一维数组,二维甚至多维数组换着使用,因为他们有相通之处。但是数组和二级指针完全不搭边啊。。。二级指针是指向指针的指针,数组顶多也就能算上指向基本变量的指针。数组指针是指向数组的指针,一般用于指向二维或者多维数组,有时也会指向一维数组。


是不是这样理解好理解一些?如下:
         在array[1][1]中,该指针类型为int(*)[1],步长为sizeof(array) = 4 * 1 * 1 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)
         在array[3][4]中,该指针类型为int(*)[4],步长为sizeof(array) = 4 * 3 * 4 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)
2、你先搞明白你所说的步长是什么东西?若你说的这个被称之为步长的话,那么变量的空间大小又是什么呢?
一般所说的步长,是指针自加一所跳过的字节数,多用于指针或者数组名的跳跃运算。
一维指针(一维数组)的步长,是该变量类型的长度,char类型的指针步长是1个字节,int类型的指针长度是4个字节;二维数组或者数组指针的步长,与变量类型有关,同样也与最低维的长度有关,int array[3][4]的步长就是4个int类型的长度,char (*p)[6]的步长就是6个char类型的长度;二维指针的长度是固定的,就是4个字节(系统的字长,64位系统的话是8个字节),因为指针存放的就是地址,所占的空间就是系统的地址长度。
你所说的那个不叫步长,而是变量的存储空间大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 17:19:28 | 显示全部楼层
数组也是一个指针,你想想int array[1][1] = { 100 };这句里面array里面放的是什么喃?array里面就是一个array[0]的地址,
你如果不信,你可以试试 int *p=*array,array为什么可以解引用?或者直接用P[0]也可以访问100,

你把array当成一个指针来看,[][]下标当成一个偏移来看,这句就变成了这样int **p = array(int **指针=指针),

还有不要忘记,计算机是从0开始的,所以[1][1]是一个元素2*2的数组,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 19:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表