| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 507 人关注过本帖
标题:数组指针问题,无聊学习指针编的,运算结果有问题!
只看楼主 加入收藏
micholasmalo
Rank: 2
等 级:论坛游民
帖 子:40
专家分:62
注 册:2012-6-22
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:7 
数组指针问题,无聊学习指针编的,运算结果有问题!
请大家帮忙下,错误的问题就是我注释的第一行上的那个元素遍历的时候有问题,地址没错的话,是我的变量b要自减,但是我不会,好像*(m+a)到第三行元素的时
#include <stdio.h>
void max(int n[][4],int v)
{
    int a,b,max=0;
    int *m;
    m=n[0];
    printf("%d\n",*m);
    for(a=0;a<v;a++)
    {
        for(b=1;b<4;b++)
        
        {    max=*(m+a)>*((m+a)+b)?*(m+a):*((m+a)+b);/*这里指针地址对吗,如果是对的,请各位帮忙想下变量b如何在跳到外层循环的时候初始化为1*/

        printf("*(m+a)=%d\t",*(m+a));
        printf("ys=%d\t",*((m+a)+b));
        printf("max=%d\t",max);
        }
                    
    }   
        printf("%d\n",max);
}
void main()
{
    int s[][4]={
        {5,2,3,4},
        {16,27,39,48},
        {33,-1,68,39}
    };
    max(s,3);
}



/*如果指针地址错误,请告诉我怎么表示,最好不要用这样的s[m][n]*/

 /*一个问题是b从新运算不等于1造成的运算错误,或是把*(m+a)指向了max,总觉得执行第二次最外层循环的时候很奇怪,应该是指向第二行大的那个48的元素,但程序好像跳到了第一行第二个元素,大家请仔细看下运算的过程,帮我想想*/
搜索更多相关主题的帖子: max include 如何 元素 
2012-07-23 21:49
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:8 
#include <stdio.h>
void max(int n[][4],int v)
{
    int a,b,max=0;
    int *m;
    m=n[0];
    printf("%d\n",*m);
    for(a=0;a<v;a++)
    {
        for(b=0;b<4;b++)
        
        {    max=max>*((m+a*4)+b)?max:*((m+a*4)+b);

        printf("*(m+a)=%d\t",*(m+a));
        printf("ys=%d\t",*((m+a)+b));
        printf("max=%d\t\n",max);
        }
                    
    }   
        printf("%d\n",max);
}
int main()
{
    int s[][4]={
        {5,2,3,4},
        {16,27,39,48},
        {33,-1,68,39}
    };
    max(s,3);
    return 0;
}

★★★★★为人民服务★★★★★
2012-07-23 22:01
circlemiss
Rank: 2
等 级:论坛游民
帖 子:30
专家分:51
注 册:2012-7-19
收藏
得分:7 
给你个建议写指针别去刻意的用*,可读性很差,一维的用p[i],二维用p[i][j]就行了么,并且指针是用来传参用的,不传参数就不会用指针的,除非是抽上了。你对二维数组的理解够,n[0]也是数组名,所以即为&n[0][0].所以*m=n[0][0].*((m+a)+b)是个什么东东。。。稍微修改一下做个参考。。。
#include <stdio.h>
void max(int n[][4],int v)
{
    int a,b,max=0;
    int *m;
    m=(int *)n;//m的空间只有4,而n即为&n[0]的空间为4*4所以需要强转,不然会警告。
    printf("%d\n",*m);
    for(a=0;a<v;a++)
    {
        for(b=0;b<3;b++)
        {   
            /*二维转一维下标公式(行*列长+列)为什么转为一维的,
            因为二维数组把列长定死了,降低了函数的通用性,所以转为一维。*/
            max=m[a*4+b]>m[a*4+b+1]?m[a*4+b]:m[a*4+b+1];
            printf("*(m+a)=%d\t",m[a*4+b]);
            printf("ys=%d\t",m[a*4+b+1]);
            printf("max=%d\t",max);
         }
                     
     }   
        printf("%d\n",max);
 }
 void main()
 {
     int s[][4]={
         {5,2,3,4},
         {16,27,39,48},
         {33,-1,68,39}
     };
     max(s,3);
 }
2012-07-23 22:31
circlemiss
Rank: 2
等 级:论坛游民
帖 子:30
专家分:51
注 册:2012-7-19
收藏
得分:0 
对不起啊, max=m[a*4+b]>m[a*4+b+1]?m[a*4+b]:m[a*4+b+1];这里我没注意。坑啊。。。你的*((m+a)+b)明白啥意思了,只是没表示对。
2012-07-23 22:49
micholasmalo
Rank: 2
等 级:论坛游民
帖 子:40
专家分:62
注 册:2012-6-22
收藏
得分:0 
回复 2楼 cnfarer
谢谢斑竹,一开始看你的*4没看明白,后来看后面的才知道二维转一维是行*列长+列,哎,看来基础没学好。。。
2012-07-23 23:07
micholasmalo
Rank: 2
等 级:论坛游民
帖 子:40
专家分:62
注 册:2012-6-22
收藏
得分:0 
回复 3楼 circlemiss
非常感谢,我是基础不好,难免疏漏,前面斑竹的回的没看明白*4是啥东东,你后面回的那条让我明白了~~~其实你的回答才是对我最有用的(就是二维转一维),想给你大分的,但斑竹的脸面是要给的,忘体谅!
2012-07-23 23:11
circlemiss
Rank: 2
等 级:论坛游民
帖 子:30
专家分:51
注 册:2012-7-19
收藏
得分:0 
第一次获得分,挺高兴的,多少无所谓,我也是新手,多多互相学习。
2012-07-23 23:44
micholasmalo
Rank: 2
等 级:论坛游民
帖 子:40
专家分:62
注 册:2012-6-22
收藏
得分:0 
回复 7楼 circlemiss
嗯,不过你基础很扎实,请多多指教!
2012-07-23 23:59
快速回复:数组指针问题,无聊学习指针编的,运算结果有问题!
数据加载中...
 
   



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

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