首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 答案是a,那这个point函数里面的p+=3有什么用啊?
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • charlie811hanson
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-19 13:15:33 楼主
    point(char *p){p+=3;}
    main()
    {char b[4]={'a','b','c','d'},*p=b;
    point(p);printf("%c\n",*p);
    }
    答案是a,那这个point函数里面的p+=3有什么用啊?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttkk_2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 13:19:331楼 得分:0
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ww2734
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 13:25:212楼 得分:0
    引用 1 楼 ttkk_2007 的回复:
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量

    是地址加了3
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 13:25:363楼 得分:0
    代码没有测试:)
    C/C++ code
    point(char **p){*p+=3;} main() { char b[4]={'a','b','c','d'},*p=b; point(&p); printf("%c\n",*p); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 13:25:404楼 得分:0
    代码没有测试:)
    C/C++ code
    point(char **p){*p+=3;} main() { char b[4]={'a','b','c','d'},*p=b; point(&p); printf("%c\n",*p); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • steedhorse
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

      4

    发表于:2008-08-19 13:30:445楼 得分:0
    没有用。
    C语言中函数内对形参的修改不影响传进来的实参。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • steedhorse
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

      4

    发表于:2008-08-19 13:31:246楼 得分:0
    注意这里是p += 3,而不是*p += 3。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lunarfan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 13:31:597楼 得分:0
    point(char *p){p+=3;}
    p的改变不影响到实参
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:00:168楼 得分:0
    引用 1 楼 ttkk_2007 的回复:
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量


    这是值传递??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttkk_2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:07:199楼 得分:0
    引用 8 楼 hqin6 的回复:
    引用 1 楼 ttkk_2007 的回复:
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量


    这是值传递??

    这不是值传递是什么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ww2734
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:07:2010楼 得分:0
    引用 8 楼 hqin6 的回复:
    引用 1 楼 ttkk_2007 的回复:
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量


    这是值传递??

    问的好,摆明了是地址传递.地址变了,值没有变!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttkk_2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:11:2911楼 得分:0
    引用 10 楼 ww2734 的回复:
    引用 8 楼 hqin6 的回复:
    引用 1 楼 ttkk_2007 的回复:
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量


    这是值传递??

    问的好,摆明了是地址传递.地址变了,值没有变!

    指针作为一个变量,在函数间传递,当然是作为一个值来传递的
    只不过它传递的是个变量的地址
    看你怎么理解了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:24:3412楼 得分:0
    引用 11 楼 ttkk_2007 的回复:
    引用 10 楼 ww2734 的回复:
    引用 8 楼 hqin6 的回复:
    引用 1 楼 ttkk_2007 的回复:
    函数里面的p+=3;只是让局部变量p加了3,而实參p本身并没有改变
    记住:这是值传递,实參p和形参p是不同的两个变量


    这是值传递??

    问的好,摆明了是地址传递.地址变了,值没有变!

    指针作为一个变量,在函数间传递,当然是作为一个值来传递的
    只不过它传递的是个变量的地址
    看你怎么理解了


    嗯,对~看来我理解太片面了!


    C/C++ code
    #include <iostream> using namespace std; void point(char **p) { *p+=3; } void main() { char b[4]={'a','b','c','d'},*p=b; cout<<(int*)p<<endl; point(&p); cout<<(int*)p<<endl; printf("%c\n",*p); // system("pause"); }


    这么就这意思!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shtianhai
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:33:5913楼 得分:0
    void point(char *p){p+=3;}
    void main()
    {
    char b[4]={'a','b','c','d'};
    char *p=b;

    point(p);printf("%c\n",*p); 
    }
    当然是值传递,虽说这个值的内容是P的地址,但不是地址传递;在point()内,是对形参p的地址进行+3(如果是*p+3则是对*p的值,也就是实参的地址进行操作的),并没有返回给实参,因此并没有改变main中p中的内容,也就是b的地址(p中内容是b的地址),可以通过查看内存了解,如果你对堆栈熟悉也应该知道;所想要达到你的目的,有两种方法:
    1、
    void point(char *p){*p+=3;}

    void main()
    {
    char b[4]={'a','b','c','d'};
    char *p=b;

    point(p);printf("%c\n",*p); 
    }
    2、
    void point(char **p){*p+=3;}

    void main()
    {
    char b[4]={'a','b','c','d'};
    char *p=b;

    point(&p);printf("%c\n",*p); 
    }
    主要是堆栈的理解,最好自己动手画画!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenzhp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:43:0614楼 得分:0
    这个和那著名的swap交换问题一样。传值和传地址的问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • c_fresher
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 15:03:4515楼 得分:0
    传指针,地址是以副本传递的,所以在调用函数中可以改地址指向变量的值,但是指针地址是不变的

    正应为如此才会有,在指针参数中定义"指向常量的指针 const int *p",但是不用定义"常量指针int *const p"或者"指向常量的常量指针const int *const p"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjin666
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:37:2916楼 得分:0
    传值和传地址的问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cakexiang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 17:10:4217楼 得分:0
    地址变了,值没变
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hahhh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 21:06:4618楼 得分:0
    我的理解,c里面只有传值。
    所谓的传地址,也是在传值,只不过这个值是个特殊的值。
    你可以通过这个值来“改变”内存,但却不能“改变”这个值(也就是当实参的指针)本身。

    拿lz的例子来解释一下:
    main()中将p当实参传到point()中去,你能通过这个值(也就是p)来“改变”内存(比如可以修改b[]),但不能“改变”传进去的p(也就是数组首地址)值本身。
    所以返回的是'a'
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • freshui
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 21:48:2019楼 得分:0
    point(p);
    函数没有修改p啊, 只修改了p的一个拷贝

    point(char *p){p+=3;}

    的执行过程可以这样理解
    point(p)
    {
      char *_p = p; //将参数变量拷贝到函数调用的栈空间上以作进一步处理, 编译器做的
      _p +=3;
    }

    记住: 函数调用的参数一定会被拷贝一次
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lunarfan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 01:25:5220楼 得分:0
    引用 18 楼 hahhh 的回复:
    我的理解,c里面只有传值。
    所谓的传地址,也是在传值,只不过这个值是个特殊的值。
    你可以通过这个值来“改变”内存,但却不能“改变”这个值(也就是当实参的指针)本身。

    拿lz的例子来解释一下:
    main()中将p当实参传到point()中去,你能通过这个值(也就是p)来“改变”内存(比如可以修改b[]),但不能“改变”传进去的p(也就是数组首地址)值本身。
    所以返回的是'a'

    严重同意,我也认为所有的传递皆是在传值
    传地址,引用也是值
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cprime
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 03:14:1721楼 得分:0
    引用楼主 charlie811hanson 的帖子:
    point(char *p){p+=3;}
    main()
    {char b[4]={'a','b','c','d'},*p=b;
    point(p);printf("%c\n",*p);
    }
    答案是a,那这个point函数里面的p+=3有什么用啊?

    答案为什么是a,楼主是不是认为把字符b传给指针p,期望输出的是b是吗。如果是这样的话,你应当
    这样 *p = b[1]。而你*p=b,是把b[0],也就是字符a传给了指针p。
    #include <stdio.h>

    point(char *p)
    {
    p+=3;
    }
    main()
    {
    char b[4]={'a','b','c','d'}, *p=b;
    printf("%d\n",p);
    printf("%c\n",*p);
    point(p);
    printf("%d\n",p);
    printf("%c\n",*p);
    }
    输出的结果
    -1073850452
    a
    -1073850452
    a
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wwq100
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 06:31:0122楼 得分:0
    #include <stdio.h>


    point(char *m){m+=3;}
    main()
    {char b[4]={'a','b','c','d'},*p=b;

    printf("%c\n",*p);
    point(p);

    printf("%c\n",*p);

    p=p+3;

    printf("%c\n",*p);

    getch();
    }

    输出为:
    a
    a
    d
    这里自己也没弄明白,呵呵,也感觉很奇怪
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • batkkk003
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:24:4723楼 得分:0
    当point()函数调用完后p就变为原来的地址!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • batkkk003
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:32:5924楼 得分:0
    #include "stdio.h"
    point(char *p){p+=3;} //阁下这里没有对变化进行保存.
    char* apoint(char *p){return p+=3; }//这个新函数对变化进行保存.
    int main()
    {char b[4]={'a','b','c','d'},*p=b;
    point(p);//调用后还原p
    printf("%c\n",*p);
    p=apoint(p);//给p指向个新地址!
    printf("%c\n",*p);
    return 0;
    }
    结果
    a
    d
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ysysbaobei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:17:4925楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ww2734
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:19:3226楼 得分:0
    引用 23 楼 batkkk003 的回复:
    当point()函数调用完后p就变为原来的地址!

    有道理!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guzhilei1986
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 11:03:4127楼 得分:0
    C/C++ code
    void point(char *&p){p+=3;} int main() { char b[4]={'a','b','c','d'},*p=b; point(p);printf("%c\n",*p); system("pause"); return 0; }

    这样输出就变成d了
    修改