倾天 发表于 2016-3-24 14:49:45

二维数组与指针的问题

#include <stdio.h>

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

这是输出:
zippo = 000000000022FE00
zippo = 000000000022FE00

为什么相等呢?

muyu0096 发表于 2016-3-24 14:49:46

本帖最后由 muyu0096 于 2016-3-24 17:22 编辑

倾天 发表于 2016-3-24 16:29
zippo是其首元素也就是zippo的地址,zippo也是其首元素zippo的地址,
如果zippo等于zippo

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

muyu0096 发表于 2016-3-24 16:07:04

关于此问题,在于2个知识点:
1,大多数情况下,c和c++将数组名视为指针,将数组名解释为其第一个元素的地址;
2,二维数组可以看做一个一维数组,只不过这个一维数组的每一个元素又是一个数组:具体到你的问题中,zippo可以看做是一个长度为4的一维数组,每个数组元素又是一个长度为3的int数组。所以,zippo,可以看做是长度为3的int数组的数组名。

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

实际上你运行下面的代码,就可以自己体会:
int _tmain(int argc, _TCHAR* argv[])
{
        using namespace std;
       int a;
        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:\t\t"<<a<<"\tsizeof(a):\t\t"<<sizeof(a)<< "\ta+1:\t"<<a+1<<endl;
        os<<"a:\t"<<&a<<"\tsizeof(&a):\t"<<sizeof(&a)<< "\t&a+1:\t"<<&a+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:                0032FD04        sizeof(a):                8        a+1:                0032FD08
a:        0032FD04        sizeof(&a):        4        &a+1:        0032FD08

此中种种内涵,通过这个程序就可以体会出来了。

倾天 发表于 2016-3-24 16:29:17

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

zippo是其首元素也就是zippo的地址,zippo也是其首元素zippo的地址,
如果zippo等于zippo,那么也就是说zippo和zippo指向同一个地址,进一步说明,
zippo指向的zippo的值就等于zippo所指向的zippo的值,再进一步说明,
zippo等于zippo, 也就是说zippo的值和指向其的指针的值相等。这是为什么?

倾天 发表于 2016-3-24 19:24:31

muyu0096 发表于 2016-3-24 17:21
zippo虽然值和zippo还有&zippo一样,但含义是不一样的,你看我给你的小程序就知道了。
zippo ...

差不多明白了,谢谢

muyu0096 发表于 2016-3-24 19:32:05

倾天 发表于 2016-3-24 19:24
差不多明白了,谢谢

不客气,另外,我刚注册,权限不够,加不了好友,也发不了短信,所以,抱歉。。。
页: [1]
查看完整版本: 二维数组与指针的问题