|
3鱼币
本帖最后由 sunnyrubik 于 2018-12-16 17:28 编辑
在数组指针那一节作业里面有两个问题是
- #include <stdio.h>
- int main()
- {
- int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- int *p = (int *)(&array + 1);//这里为什么需要强制类型转换呢?
- printf("%d\n", *(p - 6));
- return 0;
- }
复制代码
- #include <stdio.h>
- int main()
- {
- int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- int (*p)[10] = &array;//这里为什么不需要强制类型转换呢?
- printf("%d\n", *(*(p+1)-6));//这里*(p+1)是指数组的第11个元素,不是已经把值取出来了吗?为什么还要用一个*呢?为什么*(p+1)代表&array[11]而不是array[11]。小甲鱼视频里面那段也是翻来覆去地看没看懂(苦啊)
- return 0;
- }
复制代码
真的好晕啊
这里要区分的数组指针和数组元素的指针。
&array,是取得的整个数组array[10]的指针,虽然它的值和数组首元素指针(&array[0])的值相同,但是因为数据类型不同(一个是int [10],一个是int),所以它们各自代表的内存空间不同。
(&array + 1),是数组指针+1,就是说把整个array[10]空间作为一个整体。偏移了整个array[10]数组的大小,就是10个int。
也正是因为(&array+1)是数组指针,当要把它转换成数组元素(int)指针的时候,需要强制类型转换。
第二个例子里面,p是声明成了一个指向有10个int元素的数组的指针,是指向数组的指针,相当于对array取指针。所以,不需要类型转换。
实际上,(*p)=array,(*p)就是array。这样也许就更好理解printf里面的。*(p+1)是指向array后面的那个数组(比如取名B),类型和array一致。这样(B-6)就是指的(array+4)的位置,数据类型一致。
另外,array[11]是非法的写法。*(array+11)是对的。
|
最佳答案
查看完整内容
这里要区分的数组指针和数组元素的指针。
&array,是取得的整个数组array[10]的指针,虽然它的值和数组首元素指针(&array[0])的值相同,但是因为数据类型不同(一个是int [10],一个是int),所以它们各自代表的内存空间不同。
(&array + 1),是数组指针+1,就是说把整个array[10]空间作为一个整体。偏移了整个array[10]数组的大小,就是10个int。
也正是因为(&array+1)是数组指针,当要把它转换成数组元素(int)指针的时候, ...
|