标题:谭浩强的 指针访问二维数组例题有疑问
只看楼主
zhansir
Rank: 2
等 级:论坛游民
帖 子:79
专家分:69
注 册:2009-3-22
结帖率:87.5%
已结贴  问题点数:20 回复次数:12 
谭浩强的 指针访问二维数组例题有疑问
程序代码:
#include <stdio.h>

int main(int argc, char *argv[])
{
    float score[][4]={{60,70,80,90},{92,85,75,65},{65,70,85,90},{85,95,75,60}};
    float *search(float(*pointer)[4],int n);
    float *p;
    int i,m;
    printf("enter the number of student:");
    scanf("%d",&m);
   
    printf("The Scores of No.%d are:\n",m);
    p=search(score,m);
    for(i=0;i<4;i++)
    {
        printf("%5.2f\t",*(p+i));  
    }
}

    float *search(float(*pointer)[4],int n)
    {
        float *pt;
        pt= pointer+n;  //我这样写的,书上是pt=*(pointer+n),都编译正确,请问这怎么解释?
        return(pt);
    }
              


[ 本帖最后由 zhansir 于 2010-5-19 11:25 编辑 ]
搜索更多相关主题的帖子: 谭浩强 例题 指针 疑问 访问 
2010-05-19 11:06
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
得分:0 
我编译时有警告。。。。  而且本身你这代码就有问题

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-19 11:17
zhansir
Rank: 2
等 级:论坛游民
帖 子:79
专家分:69
注 册:2009-3-22
得分:0 
我重新把源码发下,我这里没有任何问题的

孔子曰:“君子食无求饱,居无求安,敏于学而慎于言,就有道而正焉,可谓好学。”
2010-05-19 11:23
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:2 
回复 楼主 zhansir
随便来个例子,都能证明谭浩强的书是垃圾的,
 

我就是真命天子,顺我者生,逆我者死!
2010-05-19 11:42
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
得分:2 
warning: assignment from incompatible pointer type(pt= pointer+n;)
改为
pt=*(pointer+n); 就没有警告

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-19 11:49
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:5 
评:

#include <stdio.h>
int main(int argc, char *argv[])
{
    float score[][4]={{60,70,80,90},{92,85,75,65},{65,70,85,90},{85,95,75,60}};
    //问题不大,第一个括号留空,如果数组长一点,我要知道第一维长度, 难不成要一个一个去数?
    //明明全是整数, 确定义为 float数组
    float *search(float(*pointer)[4],int n);
    //很少有人把函数声明放在这个位置,不容易查找到函数的信息, 结构紊乱,不易维护
    float *p;
    int i,m;
    printf("enter the number of student:");
    scanf("%d",&m);
   
    printf("The Scores of No.%d are:\n",m);
    p=search(score,m);
    for(i=0;i<4;i++)
    {
        printf("%5.2f\t",*(p+i));  
    }
}

float *search(float(*pointer)[4],int n)
{
//除非有人想表现自己的能力, 不然,为了代码易读,一般都是使用数组符号来避免使用指针
     float *pt;
     pt= pointer+n;  //我这样写的,书上是pt=*(pointer+n),都编译正确,请问这怎么解释?
     return(pt);     
//我以为 return 是个函数, 要不为什么 pt 要 加个 括号呢?
}
....


[ 本帖最后由 BlueGuy 于 2010-5-19 12:35 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-05-19 11:56
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
得分:5 
以下是引用NoSoul在19/5/2010 11:49:13的发言:

warning: assignment from incompatible pointer type(pt= pointer+n;)
改为
pt=*(pointer+n); 就没有警告
警告的意思是指针类型不兼容

PT为1级
pointer+n 为2级

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2010-05-19 11:59
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
得分:0 
老弹的书``现在哎```

不建议第一本入门书就看这个``

着本书``可以在读过其他书后再拿来看看``

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2010-05-19 12:02
liangxiao
Rank: 2
等 级:论坛游民
帖 子:7
专家分:11
注 册:2010-4-2
得分:3 
float *p;//定义的是指针
在2维数组中,
pointer+n;//不是指向具体的存储单元,而是指向行的指针
*(pointer+n);//指向列的指针
*可以将行指针转换成列指针,你需要返回的是列指针,
虽然地址是相同的,类型不匹配
2010-05-19 12:18
lxqq1000
Rank: 2
等 级:论坛游民
帖 子:23
专家分:30
注 册:2010-5-19
得分:1 
回复 楼主 zhansir
两个编译后的 运行见过不一样吧!
函数返回的是指针,不加*则返回行指针而*(p+i)就是行地址。

[ 本帖最后由 lxqq1000 于 2010-5-20 19:38 编辑 ]
2010-05-19 12:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-307261-1-1.html




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

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