鱼C论坛

 找回密码
 立即注册
查看: 1818|回复: 5

二维数组与指针的问题

[复制链接]
发表于 2016-3-24 14:49:45 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>

int main(){
        int zippo[4][3] = {{2,4},{6,8},{1,3},{5,7}};
        int (*pz)[2] = zippo;
        printf("zippo = %p\n",zippo);
        printf("zippo[0] = %p",zippo[0]);
        
}

这是输出:
zippo = 000000000022FE00
zippo[0] = 000000000022FE00

为什么相等呢?

最佳答案

查看完整内容

zippo虽然值和zippo[0]还有&zippo[0][0]一样,但含义是不一样的,你看我给你的小程序就知道了。 zippo是表示整个二维数组的指针,指向的是整个二维数组,只不过这个二维数组是在这个地址(这个地址也是zippo[0][0]的地址)开始的。所以其大小(sizeof)是整个数组的大小。同样,zippo[0]是一维数组(zippo[4])[3]的指针,所以其大小是8*3,而&zippo[0][0]是第一个元素的这个int型数据的指针,大小就是8. 所以,zippo[0]不能表 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-24 14:49:46 | 显示全部楼层
本帖最后由 muyu0096 于 2016-3-24 17:22 编辑
倾天 发表于 2016-3-24 16:29
zippo是其首元素也就是zippo[0]的地址,zippo[0]也是其首元素zippo[0][0]的地址,
如果zippo等于zippo[0 ...


zippo虽然值和zippo[0]还有&zippo[0][0]一样,但含义是不一样的,你看我给你的小程序就知道了。
zippo是表示整个二维数组的指针,指向的是整个二维数组,只不过这个二维数组是在这个地址(这个地址也是zippo[0][0]的地址)开始的。所以其大小(sizeof)是整个数组的大小。同样,zippo[0]是一维数组(zippo[4])[3]的指针,所以其大小是8*3,而&zippo[0][0]是第一个元素的这个int型数据的指针,大小就是8.
所以,zippo[0]不能表述为zippo[0][0]的指针,同样,zippo也不能表述为zippo[0][0]的指针的指针。
你用取地址运算符对zippo[0][0]取两次地址就知道了,无法编译通过的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-24 16:07:04 | 显示全部楼层
关于此问题,在于2个知识点:
1,大多数情况下,c和c++将数组名视为指针,将数组名解释为其第一个元素的地址;
2,二维数组可以看做一个一维数组,只不过这个一维数组的每一个元素又是一个数组:具体到你的问题中,zippo[4][3]可以看做是一个长度为4的一维数组,每个数组元素又是一个长度为3的int数组。所以,zippo[0],可以看做是长度为3的int数组的数组名。

结合上面2点,所以,Zippo是二维数组的第一个元素的首地址,而Zippo【0】也是第一个元素的首地址,自然值一样,但它们的含义并不一样。比如假设你的机器里,int型的长度是8而不是4(我看好像是),那么sizeof(zippo)就是4*3*8也就是整个2维数组的长度,而Zippo+1,则是加了3*8,也就是一个zippo[0]的长度。同样,sizeof(zippo[0])=3*8,而zippo+1则是增加了8(int的长度)

实际上你运行下面的代码,就可以自己体会:
int _tmain(int argc, _TCHAR* argv[])
{
        using namespace std;
         int a[3][2];
        fstream os;
        os.open("fish.txt");
        os<<"&a:\t\t"<<&a<<"\tsizeof(&a):\t\t"<<sizeof(&a)<<"\t&a+1:\t"<<&a+1<<endl;
        os<<"a:\t\t"<<a<<"\tsizeof(a):\t\t"<<sizeof(a)<< "\ta+1:\t"<<a+1<<endl;
        os<<"a[0]:\t\t"<<a[0]<<"\tsizeof(a[0]):\t\t"<<sizeof(a[0])<< "\ta[0]+1:\t"<<a[0]+1<<endl;
        os<<"a[0][0]:\t"<<&a[0][0]<<"\tsizeof(&a[0][0]):\t"<<sizeof(&a[0][0])<< "\t&a[0][0]+1:\t"<<&a[0][0]+1<<endl;
        os.close();
        std::cin.get();
        return 0;
}
我用的是c++vs2010,c平台原理一样
结果如下(我机器里int型大小是4,你机器估计是8,那就都比我的数据大1倍)
&a:                0032FD04        sizeof(&a):                4        &a+1:                0032FD1C
a:                0032FD04        sizeof(a):                        24        a+1:                        0032FD0C
a[0]:                0032FD04        sizeof(a[0]):                8        a[0]+1:                0032FD08
a[0][0]:        0032FD04        sizeof(&a[0][0]):        4        &a[0][0]+1:        0032FD08

此中种种内涵,通过这个程序就可以体会出来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-24 16:29:17 | 显示全部楼层
muyu0096 发表于 2016-3-24 16:07
关于此问题,在于2个知识点:
1,大多数情况下,c和c++将数组名视为指针,将数组名解释为其第一个元素的地 ...

zippo是其首元素也就是zippo[0]的地址,zippo[0]也是其首元素zippo[0][0]的地址,
如果zippo等于zippo[0],那么也就是说zippo和zippo[0]指向同一个地址,进一步说明,
zippo指向的zippo[0]的值就等于zippo[0]所指向的zippo[0][0]的值,再进一步说明,
zippo[0]等于zippo[0][0], 也就是说zippo的值和指向其的指针的值相等。这是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-24 19:24:31 | 显示全部楼层
muyu0096 发表于 2016-3-24 17:21
zippo虽然值和zippo[0]还有&zippo[0][0]一样,但含义是不一样的,你看我给你的小程序就知道了。
zippo ...

差不多明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-24 19:32:05 | 显示全部楼层
倾天 发表于 2016-3-24 19:24
差不多明白了,谢谢

不客气,另外,我刚注册,权限不够,加不了好友,也发不了短信,所以,抱歉。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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