数组指针和指针数组不太理解
本帖最后由 Hermione 于 2017-12-16 23:33 编辑1.
#include <stdio.h>
int main()
{
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = (int *)(&array + 1);
printf("%d\n", *(p - 6));
return 0;
}
我不明白第5行,强制转换(int *),我觉得不需要转换,因为&array + 1已经代表一个地址了啊
2.
#include <stdio.h>
int main()
{
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p) = &array;
printf("%d\n", *(*(p+1)-6));
return 0;
}
不明白第8行,我是这样想的:p+1代表一个地址,也就是array结束后的第一个地址,那么为什么还要在p+1外面加层*,这样就是去那个地址的内容了啊
我输出*(p + 1)和(p + 1),没差别,但是我输出*(*(p+1) - 6)和*((p+1)-6),差别就大了去了,实在不能理解
3.
#include <stdio.h>
int main()
{
char *p1 = {
"让编程改变世界 -- 鱼C工作室",
"Just do it -- NIKE",
"一切皆有可能 -- 李宁",
"永不止步 -- 安踏",
"One more thing... -- 苹果"
};
int i;
for (i = 0; i < 5; i++)
{
printf("%s\n", p1);
}
return 0;
}
$ gcc test3.c && ./a.out
这段代码,char *p1,这是一个数组,元素是指向字符类型的指针,那么,相当于*p1 = "让编程改变世界……",那么相当于它里面是后面这个数组的第一个位置,但是我用
char *p = "鱼C";
printf("%s", *p);
就出毛病了,停止工作什么的
P.S.谢谢大家帮助,本人大一学生,感觉程序设计基础要挂,赶紧突击一下的。 我来自己回答一下自己吧
1.&array + 1这时候的跨度是array级别的,也就是10(不考虑int的4,因为没必要),那么&array + 1这个地址是array相邻的一大块地址,通过int *,强行降低维度,那么代表的跨度又是1了,往前数6当然就是4
2.p+1的确是代表一个地址,但是它代表的跨度是10,指向的在array数组前面好多,早已越界
如果p的跨度不为1,那么*p就是在降低跨度
3.输出*(p+z)和(p+1)相等不奇怪,因为这时候都是指向一块地的第一个位置,但是它们跨度不同,所以*(*(p+1)6)和*((p+1)-6)是不一样的
我这样理解肯定跟真实情况有出入,这是为了我理解上容易,欢迎大家的补充{:10_281:} 第一个问题:
是一定需要强制转化,因为&array+1是表示一个地址,但是这个地址一定就是指向int类型的数据么,并不是,有时可能
是struct,也有可能是一个类class,所有编译器需要在赋值时给出强制转化,至于转化后的结果是否能被访问,那就是程序
崩溃的问题了。
第二个问题:
int (*p) = &array;相当于*p = array; p = &array;
如:p = 0x00400000 , 那么p+1的结果为:0x00400000 + 40; 这个40表示的是当前有10个大小4的元素,所以要跳过。
那么*(p+1)指向的地址就应该是,也就是array这个元素(虽然它并不存在,但在内存里它是存在的)
*(p+1) - 6 , 就相当于array + 10- 6;
*(*(p+1) - 6),就相当于array = array,所以输出的结果为4。
*(*(p+1)-6) 与 *((p+1)-6)的区别:p+1-6 相当于:0x0040000 - 5 * 40 ;这个地址明显是有问题的。
第三个问题:
printf("%s", *p);
printf的第二个参数是一个char *,直接传p就行,而*p表示字符数组的第一个元素。
页:
[1]