鱼C论坛

 找回密码
 立即注册
查看: 1602|回复: 7

一个简单的题目

[复制链接]
发表于 2015-7-1 12:58:49 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 零度非安全 于 2015-7-1 13:00 编辑
#include<stdio.h>
void main( )
{        
        int  i,x[3][3]={9,8,7,6,5,4,3,2,1},*p;
        p=&x[1][1];
        for(i=0;i<6;i+=3)
            printf("%d ",p[i]);
}

输出结果是什么?求详细解答

最佳答案

查看完整内容

输出结果是5, 2 x 相当于一个简单的二位数组 其中 x[0] == {9, 8, 7} x[1] == {6, 5, 4} x[2] == {3, 2, 1} p是一个int*指针, 只能指向一个一位数组或者一个int元素, 在这里 p = x[1][1] p指向了这个二维数组的第二个数组( x[1] == {6, 5, 4})的第二个元素(5), for循环一种就打印两次, 一次是p[0], 一次是p[3] p[3] 相当于 p += 3 p是一个int*指针, 对于指针来说, 指针的类型决定了指针的视野 p是int类型的指针, 整 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-1 12:58:50 | 显示全部楼层
输出结果是5, 2
x 相当于一个简单的二位数组
其中
x[0] == {9, 8, 7}
x[1] == {6, 5, 4}
x[2] == {3, 2, 1}

p是一个int*指针, 只能指向一个一位数组或者一个int元素, 在这里
p = x[1][1]
p指向了这个二维数组的第二个数组( x[1] == {6, 5, 4})的第二个元素(5),
for循环一种就打印两次, 一次是p[0], 一次是p[3]
p[3] 相当于 p += 3
p是一个int*指针, 对于指针来说, 指针的类型决定了指针的视野
p是int类型的指针, 整形指针加法操作相当于往后跨越3个int元素的位置, 即跳过了5->4->3->2
来到了元素2的位置

所以输出的就是5 2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-1 13:53:04 | 显示全部楼层
1.png

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

在内存底部一次排开
而指针p第一次指向了5的位置, 第二次往后走了三个int大小的长度(12个字节) 来到了2的位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-1 14:06:01 | 显示全部楼层
本帖最后由 零度非安全 于 2015-7-1 14:08 编辑
ryxcaixia 发表于 2015-7-1 13:47
输出结果是5, 2
x 相当于一个简单的二位数组
其中


开始我是认为指针p是存储了x[1][1]的地址,然后就是那个代码中第七行中的p[i]我看不懂它的意思,就是卡在了这里,不过经过版主这么提醒,我现在懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i] = (int*)malloc(sizeof(int) * line);
                
        for (int i = 0; i != 3; i++)
                for (int j = 0; j != 3; j++)
                        Arr[i][j] = 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[i]), Arr[i] == NULL;

        Arr = NULL;

        return 0;
}

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
零度非安全 + 5 + 5 + 3 谢谢!!!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-1 19:25:12 | 显示全部楼层
肯定是5,2呀,你把p[1][1]的地址给了 p,P就相当于有了5所在的地址,而且数组是连续地址。所以p【0】=5,p【3】=2(向后移动3位就可以了)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-8 23:44:35 | 显示全部楼层
大大大dvd是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-31 11:44:55 | 显示全部楼层
5,2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 05:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表