在步长相等的情况下,二维数组为什么不能赋值给指向指针的指针?
在步长相等的情况下,二维数组为什么不能赋值给指向指针的指针?
例如:
int array = {100};
int **p = array; //这是错误的,
int *pp = array; //这是正确的。
错误的那个步长不是都一样吗?
我感觉我掉坑里了{:10_243:} 这点我也不懂,来学习一下{:10_250:} 二者类型不一样
**p是int类型指针的指针
array是二维数组,也可以称之为数组指针,但不是指针的指针
int array = {100};
int (*p)=array;//这样写是对的。 二级指针只能指向指针变量,数组名不是指针变量 sunrise085 发表于 2021-2-2 19:53
二者类型不一样
**p是int类型指针的指针
array是二维数组,也可以称之为数组指针,但不是指针的指针
但是它们步长不是一样的吗?我特意写的array;就是没写array;
一维数组需要一层解引用,
例如:
int str[] = {1, 2, 3, 4, 5};
可以是: int *q= str;
也可以是: int (*q) = &str;
我想说的意思是数组指针我也懂,但是二维数组的数组指针不是也要两次解引用吗?为什么就是不可以。。。。
类型都是一个地址啊,步长在array这个二维数组里也一样啊。{:10_254:} You-Name 发表于 2021-2-3 15:57
但是它们步长不是一样的吗?我特意写的array;就是没写array;
一维数组需要一层解引用,
这与步长关系不大,主要是类型不一样啊!!
类型不一样,不能任意赋值啊!!
一米长的钢铁可以和一米长的钢铁焊接在一起,但是你能把一米长的钢铁和一米长的棉绳焊在一起么? sunrise085 发表于 2021-2-3 16:46
这与步长关系不大,主要是类型不一样啊!!
类型不一样,不能任意赋值啊!!
这解释{:10_269:}
额。。数组指针也是一种类型吗?
数组和指针难道不是一个不是左值,一个是左值只有这点不一样吗?????
是不是这样理解好理解一些?如下:
在array中,该指针类型为int(*),步长为sizeof(array) = 4 * 1 * 1 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)
在array中,该指针类型为int(*),步长为sizeof(array) = 4 * 3 * 4 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)
您看下我理解的类型和步长对吗?{:10_254:} You-Name 发表于 2021-2-3 17:10
这解释
额。。数组指针也是一种类型吗?
数组和指针难道不是一个不是左值,一个是左值只有这 ...
问题越讨论越清晰
知识点越讨论越深刻
但是前提是你需要对基本的知识点有了解,才能深入的讨论啊
1、你先弄明白什么是指针,什么是数组,什么是数组指针,什么又是二级指针
有些情况下指针和数组的确可以相互换着使用,但那是有条件的。一级指针有事可以和一维数组,二维甚至多维数组换着使用,因为他们有相通之处。但是数组和二级指针完全不搭边啊。。。二级指针是指向指针的指针,数组顶多也就能算上指向基本变量的指针。数组指针是指向数组的指针,一般用于指向二维或者多维数组,有时也会指向一维数组。
是不是这样理解好理解一些?如下:
在array中,该指针类型为int(*),步长为sizeof(array) = 4 * 1 * 1 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)
在array中,该指针类型为int(*),步长为sizeof(array) = 4 * 3 * 4 ;而二级指针类型为int **;步长为4;(注:32位系统小红帽虚拟机)2、你先搞明白你所说的步长是什么东西?若你说的这个被称之为步长的话,那么变量的空间大小又是什么呢?
一般所说的步长,是指针自加一所跳过的字节数,多用于指针或者数组名的跳跃运算。
一维指针(一维数组)的步长,是该变量类型的长度,char类型的指针步长是1个字节,int类型的指针长度是4个字节;二维数组或者数组指针的步长,与变量类型有关,同样也与最低维的长度有关,int array的步长就是4个int类型的长度,char (*p)的步长就是6个char类型的长度;二维指针的长度是固定的,就是4个字节(系统的字长,64位系统的话是8个字节),因为指针存放的就是地址,所占的空间就是系统的地址长度。
你所说的那个不叫步长,而是变量的存储空间大小 数组也是一个指针,你想想int array = { 100 };这句里面array里面放的是什么喃?array里面就是一个array的地址,
你如果不信,你可以试试 int *p=*array,array为什么可以解引用?或者直接用P也可以访问100,
你把array当成一个指针来看,[][]下标当成一个偏移来看,这句就变成了这样int **p = array(int **指针=指针),
还有不要忘记,计算机是从0开始的,所以是一个元素2*2的数组,
页:
[1]