二维数组与指针的问题
#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 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取两次地址就知道了,无法编译通过的。 关于此问题,在于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
此中种种内涵,通过这个程序就可以体会出来了。 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的值和指向其的指针的值相等。这是为什么? muyu0096 发表于 2016-3-24 17:21
zippo虽然值和zippo还有&zippo一样,但含义是不一样的,你看我给你的小程序就知道了。
zippo ...
差不多明白了,谢谢 倾天 发表于 2016-3-24 19:24
差不多明白了,谢谢
不客气,另外,我刚注册,权限不够,加不了好友,也发不了短信,所以,抱歉。。。
页:
[1]