为何这两个语句输出是一样的
为什么这两个语句输出是一样的?
输出是:

------解决思路----------------------
在C语言中除了整形,浮点型,还有指针等基本类型之外,还有一种特殊的类型,即[b]数组类型。比如 int arr[4],arr的类型是int [4],arr虽然可以当做指针使用,但是它实际上是一个数组类型,不信的话试试下面的输出:
int arr[4]. *p; // sizeof(arr) = 16, sizeof(p) = 4
然后&arr是什么类型呢,C语言中对任何一个东西取地址运算(&),都成为指针类型,那么它(&arr)的类型就是一个指针,指向什么?指向一个数组。这个指针怎么声明呢,是这个样子的:int (*p_arr) [4] = &arr;
p_arr是一个指针,指向一个数组,数组的长度是4,数组中每个元素的类型是int。
假设数组arr所在的起始位置是0(实际不可能,只是为了计算方便),arr+4的值是多少?arr虽然是数组类型,但是arr在使用的时候它被编译器认为是指向数组第一个元素的指针,它的值就是数组第一个元素的地址,即0,那么arr+4 = 0 + 4*4 = 16。然后&arr+4的值是多少呢?&arr是指针类型,指向一个数组,已知数组的大小是16字节(参考上面的sizeof(arr)),那么&arr + 4 = 0 + 16*4 = 64。那么&arr+4是什么类型的呢?很容易判断&arr+4的类型就是&arr的类型,由上面的分析可知,是int (*)[4]类型。*(&arr+4)又是什么类型?已知类型int (*)[4],执行指针的解引用操作(指针降级),就是去掉一个*符号,总而言之,就是int [4]类型。看到没有,指向数组类型的指针降级之后就变成数组类型了。数组类型在使用过程中仍被编译器看做一个指针,这就是为什么两行的输出是一模一样的:编译器打印一个指针时显示的是指针的值(64),编译器在打印一个数组时打印出来的是数组第一个元素的地址(64+0*4=64)。[/b]
------解决思路----------------------
数组名 和 数组名取地址 一样 , 即 array1 == &array1 , 但地址类型不一样, &array1的类型是 int (*)[4],而前面那个是int *,所以 &array1+4 之后的地址类型还是 int (*)[4], 对这样一个地址取*,跟原来&array1==array1地址一样的道理。
------解决思路----------------------
顶楼上的...
按照你写的数组,+4其实应该是已经越界了,因为只是地址所以没什么影响,最大的话应该只能+3。
根据楼上的解释,两者输出的都是数组元素的地址,所以是相同的。
楼主可以试试这个...
int array1[]={1,11,22,3};
cout<<*(&array1+4)<<endl;
cout<<&array1+4<<endl;
输出是:
------解决思路----------------------
在C语言中除了整形,浮点型,还有指针等基本类型之外,还有一种特殊的类型,即[b]数组类型。比如 int arr[4],arr的类型是int [4],arr虽然可以当做指针使用,但是它实际上是一个数组类型,不信的话试试下面的输出:
int arr[4]. *p; // sizeof(arr) = 16, sizeof(p) = 4
然后&arr是什么类型呢,C语言中对任何一个东西取地址运算(&),都成为指针类型,那么它(&arr)的类型就是一个指针,指向什么?指向一个数组。这个指针怎么声明呢,是这个样子的:int (*p_arr) [4] = &arr;
p_arr是一个指针,指向一个数组,数组的长度是4,数组中每个元素的类型是int。
假设数组arr所在的起始位置是0(实际不可能,只是为了计算方便),arr+4的值是多少?arr虽然是数组类型,但是arr在使用的时候它被编译器认为是指向数组第一个元素的指针,它的值就是数组第一个元素的地址,即0,那么arr+4 = 0 + 4*4 = 16。然后&arr+4的值是多少呢?&arr是指针类型,指向一个数组,已知数组的大小是16字节(参考上面的sizeof(arr)),那么&arr + 4 = 0 + 16*4 = 64。那么&arr+4是什么类型的呢?很容易判断&arr+4的类型就是&arr的类型,由上面的分析可知,是int (*)[4]类型。*(&arr+4)又是什么类型?已知类型int (*)[4],执行指针的解引用操作(指针降级),就是去掉一个*符号,总而言之,就是int [4]类型。看到没有,指向数组类型的指针降级之后就变成数组类型了。数组类型在使用过程中仍被编译器看做一个指针,这就是为什么两行的输出是一模一样的:编译器打印一个指针时显示的是指针的值(64),编译器在打印一个数组时打印出来的是数组第一个元素的地址(64+0*4=64)。[/b]
------解决思路----------------------
数组名 和 数组名取地址 一样 , 即 array1 == &array1 , 但地址类型不一样, &array1的类型是 int (*)[4],而前面那个是int *,所以 &array1+4 之后的地址类型还是 int (*)[4], 对这样一个地址取*,跟原来&array1==array1地址一样的道理。
------解决思路----------------------
顶楼上的...
按照你写的数组,+4其实应该是已经越界了,因为只是地址所以没什么影响,最大的话应该只能+3。
根据楼上的解释,两者输出的都是数组元素的地址,所以是相同的。
楼主可以试试这个...
for(int i = 0;i < 4;i++)
cout<<*(&array1+i)<<"\t"<<&array1+i<<endl;