一个简单的题目
本帖最后由 零度非安全 于 2015-7-1 13:00 编辑#include<stdio.h>
void main( )
{
inti,x={9,8,7,6,5,4,3,2,1},*p;
p=&x;
for(i=0;i<6;i+=3)
printf("%d ",p);
}
输出结果是什么?求详细解答{:7_119:} 输出结果是5, 2
x 相当于一个简单的二位数组
其中
x == {9, 8, 7}
x == {6, 5, 4}
x == {3, 2, 1}
p是一个int*指针, 只能指向一个一位数组或者一个int元素, 在这里
p = x
p指向了这个二维数组的第二个数组( x == {6, 5, 4})的第二个元素(5),
for循环一种就打印两次, 一次是p, 一次是p
p 相当于 p += 3
p是一个int*指针, 对于指针来说, 指针的类型决定了指针的视野
p是int类型的指针, 整形指针加法操作相当于往后跨越3个int元素的位置, 即跳过了5->4->3->2
来到了元素2的位置
所以输出的就是5 2
可以看出这三个数组在内存中是连续存放的
每个数组内有三个整形元素 占了12个字节(3 * sizeof(int))
在内存底部一次排开
而指针p第一次指向了5的位置, 第二次往后走了三个int大小的长度(12个字节) 来到了2的位置 本帖最后由 零度非安全 于 2015-7-1 14:08 编辑
ryxcaixia 发表于 2015-7-1 13:47
输出结果是5, 2
x 相当于一个简单的二位数组
其中
开始我是认为指针p是存储了x的地址,然后就是那个代码中第七行中的p我看不懂它的意思,就是卡在了这里,不过经过版主这么提醒,我现在懂了{:7_113:} #include<stdio.h>
int main( )
{
int row = 3;
int line = 3;
int** Arr = (int**)malloc(sizeof(int*) * row);
for (int i = 0; i != row; i++)
Arr = (int*)malloc(sizeof(int) * line);
for (int i = 0; i != 3; i++)
for (int j = 0; j != 3; j++)
Arr = i*line + j;
// p1, p2, p3 分别为三个一维数组
const int** pp = (const int**)Arr;
const int*p1 = *(pp + 0);
const int*p2 = *(pp + 1); // 考虑下这里为何不是 *pp + 1
const int*p3 = *(pp + 2);
// mid_1, mid_2, mid_3, 分别取这三个数组的中间值
int mid_1 = *(p1 + 1);// 考虑下 这里 如果换成*p1 + 1之后?
int mid_2 = *(p2 + 1);
int mid_3 = *(p3 + 1);
// Release Memory
for (int i = 0; i != row; i++)
free(Arr), Arr == NULL;
Arr = NULL;
return 0;
}
给楼主一个小例子 相信如果理解了 就会深刻明白指针的类型决定指针的视野 这句话的精髓了 肯定是5,2呀,你把p的地址给了 p,P就相当于有了5所在的地址,而且数组是连续地址。所以p【0】=5,p【3】=2(向后移动3位就可以了)。 大大大dvd是 5,2
页:
[1]