鱼C论坛

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

请教各位一个指针问题

[复制链接]
发表于 2013-5-11 12:58:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void main(void)
{
    int a[3][4] = {{0,1,2,3},{4,5,6,7},{7,8,9,10}};
    int i, j;
    int (*p)[4];
for (; p < a+3; p++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("%-6d",*(*p+j));
        }
        printf("\n");
把*(*p+j);
换成**p+j;
结果为什么相等?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-5-11 13:02:41 | 显示全部楼层
有木有大神帮忙看看啊:Q
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-11 13:50:11 | 显示全部楼层
#include <stdio.h>
void main(void)
{
    int a[3][4] = {{0,1,2,3},{4,4,4,4},{7,8,9,10}};//我把第二个赋值改了让它不那么特殊
    int j;
    int (*p)[4];
        p=a;     //不知道是楼主打漏了还是怎么的
for (; p < a+3; p++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("%-6d",*(*p+j));
        }
        printf("\n");
}
}
另外*(*p+j)与**p+j是不同的
**p+j是得到了每行的第一个数后再加上j
你会觉得一样是因为你给的数特殊了那是巧合
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-11 14:34:12 | 显示全部楼层
本帖最后由 pcfate 于 2013-5-11 14:35 编辑

楼主定义完指针记得初始化!
两次输出的结果虽然一样,但是编译器处理的过程却不同,建议楼主可以反编译一下,查看下汇编代码。
逻辑上应该这样理解:
*(*p+j);   *p其实是取到的是一个地址,依次后移 j 位的同时,分别再*操作符来取其中的值,这个时候得到的值是数据。

而**p+j ; 是先取到p的地址,再取p地址中存放的数据,再然后依次往后移动 j 位来输出。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-11 21:37:23 | 显示全部楼层
我只是路过打酱油的。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-11 23:21:04 | 显示全部楼层
这个问题你其实犯了个错误
你如果把    a【】【】数组的  第0行  改一下,结果就不一样了   改成
a[3][4]={{3,3,2,3},{4,5,6,7},{7,8,9,9}};

*(*p+j) 的含义   其实 相当于  p[0][j] 他的原型为*(*p[+i]+j)  其中括号内i为  对应 的a的行号为0
结果应该为 a数组的第一行  即:3,3,2,3
**p+j   的含义    其实 相当于  a[0][0]+j   其中 a[0][0]的值固定 为3  加上 你循环变量J的值  
就是  3,4,5,6
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-5-25 19:12:56 | 显示全部楼层

谢谢。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-25 23:29:55 | 显示全部楼层
强烈支持楼主ing……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-28 14:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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