鱼C论坛

 找回密码
 立即注册
查看: 4390|回复: 10

关于一维数组与二维数组的赋值问题

[复制链接]
发表于 2012-5-21 05:37:32 | 显示全部楼层 |阅读模式
1鱼币
如果定义一个一维数组:

int a[10] = {0};
int *p;
p = a;
这里p= a没有错,
********************************************************
而当我们定义一个二维数组时:

int  a[3][4] = {0};
int *p ;
p = a;

这时是错的,
********************************************************
而是要定义成一个一维数组的指针变量:

int  a[3][4] = {0};
int (*p)[4];
p = a;
这又是对的

********************************************************

谁能解释一下吗, 难道这是一种C本身的规定吗,是一维的话,直接定义成int *p就能p = a了
当是二维数组的时候,就要定义成int (*p)[4]就能p = a了?!

最佳答案

查看完整内容

初学者这是个难点! 第一个: int a[10] = {0}; int *p; p = a; 这里p= a没有错, //因为你定义的是一维数组a[10],数组名就是首元素的地址,即&[0],所以可以赋值给指针p; 第二个: int a[3][4] = {0}; int *p ; p = a; 这时是错的 //你定义了一个二维数组a[3][4],二维数组不同之处是:你可以把它看为三个一维数组, a[0]是一级指针,指向一个数组,这个数组的元素是a[0][0],a[0][1],a[0][2],a[0][3]; a[1]是一级指针 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-5-24 12:23:26 | 显示全部楼层

不是理解好点,实际情况就是这样的啊,以前学的时候老师就是这样讲的!!记得采纳哦。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-24 05:17:00 | 显示全部楼层
难得糊涂 发表于 2012-5-22 13:23
初学者这是个难点!
第一个:
int a[10] = {0};

你这个好理解点
谢谢
我回去再看看书
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 07:53:38 | 显示全部楼层
简单的让你理解一下:
二维数组情况:定义 int *p = a[3][4];(这是伪代码有错误,你明白就好);

只是将首地址a[0][0]给了指针p,那么我问你一个问题,现在编译器知道它的第二个下标是几吗?
如果不知道,这不是很危险吗?即使越界了也不知道,会溢出的。
所以要给出第二个下标的值int (*p)[4];

提醒你一下:之前你在学习到二位数组的定义时,是否告知你定义二位数组缺省定义时,
第二个下标是不可以省略的。int a[][2] = {1 , 2 , 3 , 4};

加油!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-22 05:03:37 | 显示全部楼层
有点乱~~我再看看.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 16:52:52 | 显示全部楼层
  1. int (*p)[4];
复制代码
这里,你定义的p是一个数组,里面存放的是4个指向int型的指针(即指针型数组),因为数组名是数组首元素的地址,所以p==&p[0],又因为p[0]是数组的元素(它是一个指向int型的指针),所以p就是二级指针,
  1. int  a[3][4] = {0};
  2. int *p ;
  3. p = a;这样二级指针的值赋给一个二级指针就没错了(指针赋值的类型匹配是很严格的)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 16:44:31 | 显示全部楼层
本帖最后由 楚门 于 2012-5-21 16:46 编辑
  1. int a[3][4] ;
复制代码
这里,先看成是一个一维数组,数组的每个元素都是一个有四个int型变量的数组(即每一行是一个int[4]),所以a[0],a[1],a[2]就是每行的首地址,那么a==&a[0];因为a[0]本身就是一个地址,所以a就是一个二级指针(即指向指针的指针)
  1. int a[10] = {0};
  2. int *p;
  3. p = a;所以这样赋值是不对的
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 14:01:49 | 显示全部楼层
这个问题对于初学者是个很头大的问题,确实很头疼。。。你在搞这些东西之前先明白,对于一个一维数组a[10]  它的首地址是&a[0] ,a只是这个东西一个简写形式而已,为了方便书写c规定可以把数组名作为一个数组的首地址,这是针对一维数组而言。对于二维数组,int a[10][10]  这样的 它的首地址就是&a[0][0]  但是也可以简写成a[0],前面不是说了a==>&a[0]吗?所以这里的二维数组a==&a[0]==&(&a[0][0]),这里你就会发现,一维数组的a跟而位数组的a之间很很大的区别,类型的区别,不要只顾着看值的相等,值相等但是类型不一样,肯定就出错了,你试试定义一个数组  int a[10][10]; int *p;   p=*a;  就不会出错了,给一个变量取地址eg:
int a;  ( &a) 这个类型就成为int *类型了, 就是他原有的类型前面加一个*号,取值符“*”,是给原来的类型减去一个*,这就是为什么一个int 类型的变量不能 用*取值了,只有指针变量可以,也就是带*号的变量。数组指针这个东西,谭浩强那本书上其实讲的很详细,你可以反复看看,我给你说个书上没有的,对于int (*p)[10] 这样的情况,也就是定义了一个数组指针变量,其实按原理是要这样定义的 int [10]  * p;   把一个数组看成一种类型,就例如一个结构体一样,这里定义了一个有是个元素的数组这种类型的指针变量p;
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 10:16:16 | 显示全部楼层
而当我们定义一个二维数组时:

int  a[3][4] = {0};
int *p ;
p = a;

这时是错的,
********************************************************
而是要定义成一个一维数组的指针变量:

int  a[3][4] = {0};
int (*p)[4];
p = a;
这又是对的

********************************************************
我也是一个初学者。刚接触指针的时候在这些问题上确实不太容易很清晰的弄懂。大概的意思就是,2维数组可以看成3个连续的一维数组,你定义的*p是指向列的不是指向行的,所以你那样赋值是错误的,尔你定义的(*p)[4]是指向行的。所以可以赋值。a[3][4]你可以看成是3个连续的有4个元素的1维数组。虽然二维数组的首地址和第一个一维数组的首地址是一样的,但是他们表示的意义是不一样的。一个指向行,一个是指向列。不知道这么说你能看明白不。如果还不明白,那么OK。反复的看指针这一章,一直到彻底领悟。没看明白别继续。后边的内容基本都和指针有关系!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-21 05:38:43 | 显示全部楼层
今天在抄代码时发现的,在想:一维数组能这样,为什么二维这样的话就报错了呢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 05:37:33 | 显示全部楼层
初学者这是个难点!
第一个:
int a[10] = {0};
int *p;
p = a;
这里p= a没有错,
//因为你定义的是一维数组a[10],数组名就是首元素的地址,即&[0],所以可以赋值给指针p;
第二个:
int  a[3][4] = {0};
int *p ;
p = a;
这时是错的
//你定义了一个二维数组a[3][4],二维数组不同之处是:你可以把它看为三个一维数组,
a[0]是一级指针,指向一个数组,这个数组的元素是a[0][0],a[0][1],a[0][2],a[0][3];
a[1]是一级指针,指向一个数组,这个数组的元素是a[1][0],a[1][1],a[1][2],a[1][3];
a[2]是一级指针,指向一个数组,这个数组的元素是a[2][0],a[2][1],a[2][2],a[2][3];
到这里你应该明白了,二维数组名a,指向a[0],而a[0]本身就是地址,指向a[0][0]
以一言以蔽之,a是二级指针,不能赋值给一级指针p
第三个:
int  a[3][4] = {0};
int (*p)[4];
p = a;
//int (*p)[4],定义了一个 指向一个含有四个元素的整型数组,p指向数组的首元素的地址,因此p是二级指针!!
这又是对的

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-23 07:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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