零度非安全 发表于 2015-7-1 12:58:49

一个简单的题目

本帖最后由 零度非安全 于 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:}

ryxcaixia 发表于 2015-7-1 12:58:50

输出结果是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

ryxcaixia 发表于 2015-7-1 13:53:04



可以看出这三个数组在内存中是连续存放的
每个数组内有三个整形元素 占了12个字节(3 * sizeof(int))

在内存底部一次排开
而指针p第一次指向了5的位置, 第二次往后走了三个int大小的长度(12个字节) 来到了2的位置

零度非安全 发表于 2015-7-1 14:06:01

本帖最后由 零度非安全 于 2015-7-1 14:08 编辑

ryxcaixia 发表于 2015-7-1 13:47
输出结果是5, 2
x 相当于一个简单的二位数组
其中


开始我是认为指针p是存储了x的地址,然后就是那个代码中第七行中的p我看不懂它的意思,就是卡在了这里,不过经过版主这么提醒,我现在懂了{:7_113:}

ryxcaixia 发表于 2015-7-1 14:12:33

#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;
}

给楼主一个小例子 相信如果理解了 就会深刻明白指针的类型决定指针的视野 这句话的精髓了

SA突袭 发表于 2015-7-1 19:25:12

肯定是5,2呀,你把p的地址给了 p,P就相当于有了5所在的地址,而且数组是连续地址。所以p【0】=5,p【3】=2(向后移动3位就可以了)。

youngo 发表于 2015-7-8 23:44:35

大大大dvd是

你好,曾桑 发表于 2015-7-31 11:44:55

5,2
页: [1]
查看完整版本: 一个简单的题目