| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1239 人关注过本帖
标题:万恶的指针...
只看楼主 加入收藏
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 9楼 TonyDeng
指针最基础的知识我懂
我想问一下,
 printf ("---->%d\n",*(address+i));    这样写的话是不是相当于
printf ("---->%d\n",100);                    假如我第一次输入的是100

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-08-20 17:07
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用admin_xyz在2012-8-20 17:07:19的发言:

指针最基础的知识我懂
我想问一下,
 printf ("---->%d\n",*(address+i));    这样写的话是不是相当于
printf ("---->%d\n",100);                    假如我第一次输入的是100

假如(address+i)指向的变量的值是100 当然是一样的了
2012-08-20 17:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,address是指针,address+i是在这个指针的位置处偏移i个同类数据长度,然后用*号获取这个位置处的数据,假如此处的数据恰好是100,就是你所说的那样了。

授人以渔,不授人以鱼。
2012-08-20 17:11
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
指针本身不难 也就是几个基本的知识点 麻烦的是 这玩意和其他东西弄一块 变得复杂了
2012-08-20 17:13
shmily520m
Rank: 1
等 级:新手上路
帖 子:12
专家分:4
注 册:2012-7-31
收藏
得分:0 
printf("%d\n",*(address+i))语句等价于printf("%d\n",100)//假如输入的是100.
你这样理解:*address的意思是address内容所指地址的内容。
有这样一个比方:我去找你还书,但是你不在,我留了张纸条在桌上,告诉你书放在你2层3号的书架上了。当你回来看到纸条就会找到书了。你想想看纸条的作用是什么?纸条本身不是书,上面也没有书,那你如何能找到书呢?因为纸条上写了书的位置嘛!所有这个时候纸条就是一个指针了。
2012-08-20 17:14
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
恩,懂了。又出现了一个问题

程序代码:
#include <stdio.h>
#include <stdlib.h>

int main()

{
    int     i;
    int     *address = (int *) malloc(sizeof(int) * 5);

    printf ("The first address of the system to allocate space:%p\n",address);

    for (i = 0;i < 5;i++)

        {
            printf ("%p---->",address+i);
            scanf ("%d",address+i);
        }

    free (address);                     //调试时发现free后会把address+0处的数据清0。为什么,书上说的是释放指针变量address所指向的动态空间,我的理解是释放malloc函数向系统申请的空间,释放内存。以便下次继续申请。

    for (i = 0;i < 5;i++)

        {
            printf ("---->%d\n",*(address+i));
        }



    return 0;
}


总有人比你努力,可怕的是比你牛的人比你还努力。
2012-08-20 17:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用zklhp在2012-8-20 17:13:51的发言:

指针本身不难 也就是几个基本的知识点 麻烦的是 这玩意和其他东西弄一块 变得复杂了

确实是这样。手指指向太阳,说这是太阳,但人们的注目点往往是手指,把手指认为是太阳的,所在多有。手指变换很快,所以说指针快,但很多人并不知道,变指针不等于变实体,太阳不是随着你手指变动而变动的,要搬动太阳,还得费那么大的劲,省不了。当你的应用真要搬动数据实体的时候,用什么都省不了,不要说指针能省力什么的,只能老老实实地复制拷贝。

其实用*p取值,也不比用x取值来得快,前者要先得到p的值,寻址到对应的位置,再取值,而后者是直接到那个位置取值。对值类型的数据(比如int、char、double之类)使用指针,是不值得的,指针的用处,就是针对引用数据类型,因为那些数据在堆空间中,只能用指针寻访。

[ 本帖最后由 TonyDeng 于 2012-8-20 17:21 编辑 ]

授人以渔,不授人以鱼。
2012-08-20 17:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-8-20 17:18:38的发言:


确实是这样。手指指向太阳,说这是太阳,但人们的注目点往往是手指,把手指认为是太阳的,所在多有。手指变换很快,所以说指针快,但很多人并不知道,变指针不等于变实体,太阳不是随着你手指变动而变动的,要搬动太阳,还得费那么大的劲,省不了。当你的应用真要搬动数据实体的时候,用什么都省不了,不要说指针能省力什么的,只能老老实实地复制拷贝。

其实用*p取值,也不比用x取值来得快,前者要先得到p的值,寻址到对应的位置,再取值,而后者是直接到那个位置取值。对值类型的数据(比如int、char、double之类)使用指针,是不值得的,指针的用处,就是针对引用数据类型,因为那些数据在堆空间中,只能用指针寻访。

对啊 其实指针对性能的提升几乎没有 只不过增加了灵活性罢了 呵呵
2012-08-20 17:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 16楼 admin_xyz
free()只是在那个入口处作一个标志,告诉操作系统“这块空间我现在没用了,你看什么时候方便就收回吧”,操作系统什么时候处置它,是不知道的。

授人以渔,不授人以鱼。
2012-08-20 17:24
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
//调试时发现free后会把address+0处的数据清0。为什么,书上说的是释放指针变量address所指向的动态空间,我的理解是释放malloc函数向系统申请的空间,释放内存。以便下次继续申请。

这个属于函数的行为了 深究它有什么意思呢
2012-08-20 17:24
快速回复:万恶的指针...
数据加载中...
 
   



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

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