| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1460 人关注过本帖
标题:狠简单的指针问题,求解...
只看楼主 加入收藏
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:41 
狠简单的指针问题,求解...
程序代码:
#include<stdio.h>
int main()
{
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    int *p;
    for(p=a[0];p<a[0]+12;p++)
    {
        if((p-a[0])%4==0)  //这里!!!
            printf("\n");
        printf("%d\t",*p);
    }
    printf("\n");
}

例如p首地址是1000,第二个时是1004呀,(1004-1000)%4等于0啊!为什么不是第二个就换行?求高手求解
2011-08-13 23:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这不是指针问题,是运算法则问题,自己检查一下if中表达式是怎么计算的。

我反复说过:写程序要反复问自己正在写什么,每一行想达到什么目的,达到了没有?

授人以渔,不授人以鱼。
2011-08-13 23:39
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 2楼 TonyDeng
我想四个就换行! 但是按照我的说话哪里错了?
2011-08-13 23:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你用指针的值减数组元素a[0]是什么意思?你在每次循环中,把p和a[0]打印出来看看,跟你预想的模式吻合吗?这是写程序和检查程序最基本的方法呀,动手跟踪数据,看看是不是你所想象的那样。

授人以渔,不授人以鱼。
2011-08-14 00:04
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 4楼 TonyDeng
听你的做了,感觉没有错误啊,运行出来是四个就换行,但看程序应该就是每个都得换行。开鼓吧大侠!我已经闷了一个下午了!
2011-08-14 00:13
风生钧起
Rank: 4
来 自:江西
等 级:业余侠客
帖 子:383
专家分:246
注 册:2011-7-26
收藏
得分:0 
拿下系统分

指针是什么    数组是什么
指针跟数组 什么联系
地址 跟指针 数组有什么联系
内存 跟 地址 指针 数组 有什么联系
以上问题 若很清楚  

你那语句 就不会这样想当然 啦

墨一世红颜倾醉己    霁天谁与话风流

修仙``````````````````````````````````````````````
2011-08-14 00:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那是因为你a[0]恰好是1,p-1的结果是指针回退一格,再与4取模。你觉得这种逻辑对吗?令a[0]=10试试。
你还在觉得指针与元素加减运算是正确的,把数组的类型改为double数据,看你这程序怎么崩溃法。

授人以渔,不授人以鱼。
2011-08-14 00:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
for()循环中,开始令p=a[0]=1,那是什么地址?此时指针指向哪里、指向什么值,你知道吗?用这个地址运算,幸好你不是对那个地址赋值,也没使用*p求值,运气了。
最后输出的*p,跟预想的吻合吗?
第一、二次都出现换行,没看出来吗?

[ 本帖最后由 TonyDeng 于 2011-8-14 00:35 编辑 ]

授人以渔,不授人以鱼。
2011-08-14 00:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这种每四个元素输出一行的动作,要用得着指针么?还要这样计算?用得for循环,多用一个内存变量作计数器,都比你现在加减取模运算强啦。用了指针,又掺杂数组下标求址,明着是想消除指针优势。

授人以渔,不授人以鱼。
2011-08-14 00:48
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:10 
8楼都是说的什么乱七八糟的 别误人子弟!!不过你们请看清楚房主究竟哪个地方不懂再回答好不好! 我看的窝火!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
你这个问题很简单~ 指针相减你知道结果是什么吗?

指针++  --操作你肯定不陌生吧!

不过指针还有一个相减的操作如果2个int型指针相减结果不是单纯的地址相减他还会除以int型大小这里就是4啦
sizeof(int)=4
~
你这里假设 p=1004  a[0]=1000;  p-a[0]的意思就是 (1004-1000)/sizeof(int)=1; 这里你可能会说a[0]应该等于1啊!不过其实这里的a[0]是一个地址;因为这是一个双重数组;通俗说就是数组的数组;这就是多重数组和普通数组的区别;下面我举例说了一下:
例子 int a[10][4]; a[7]-a[5]=8意思就是a[7]的地址减去a[8]的地址然后除以int的大小(就是4)结果为8因为a[5]到a[7]有8个整形元素;懂了吧?有人会说我瞎说!不过这个是2重数组的问题; a[5] a[7] 这里是指针 是地址 是指向当前数组的列指针;a[7] ++ 就是a[7][1]而a[7]就是 a[7][0]; 就像 a == a[0][0] == a[0];一样;a是行指针 a++ 就是a[1][0];   a[0]是列指针a[0]++    就是 a[0][1]; 而 a[0][0]是int 型的数值了 如果a[10][5]={1,2,3,4,5,6,7,8,9,10.........}; 则a[0][0]++ == 2;所以你这里的P就是列指针,p++  就是指向下一个数组元素;p-a[0]; 结果是整形;它的值就是他距离首地址有几个元素;

指针相加是没有意义的!

有不懂的你加我QQ 522353113~

[ 本帖最后由 jcw08120110 于 2011-8-14 14:40 编辑 ]

君生我未生 我生君以老
2011-08-14 10:39
快速回复:狠简单的指针问题,求解...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017169 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved