如何不陌路 2015-02-12 05:03 采纳率: 100%
浏览 2397
已采纳

C语言指针移动后指向问题

void change _ prt();
main()
{
int * prt,b[3] = {1,2,3};
prt = b;
change _ prt(prt);
printf("%d\n", * prt);
}
void change _ prt(p)
int * p;
{ p+=2;
}
为什么结果是1,而不是3?
谢谢。

  • 写回答

5条回答 默认 最新

  • 幻夢之葉 2015-02-12 05:36
    关注

    你这代码一堆错误,能编译通过?

     void change_prt(int ** p);
    int main()
    { 
        int *prt,b[3] = {1,2,3};
        prt = b;
        change_prt(&prt);
        printf("%d\n", * prt);
    
        return 0;
    }
    
    void change_prt(int **p)
    {
        p+=2;
    }
    

    至于结果为什么不是3
    指针可以通过修改它指向的内容
    但是你这里是修改指针本身的值(如32位机子下,指针是32位的地址,你只是修改了地址值而不是该指针指向的内存)
    在这里来说指针值只是个值传递,会拷贝临时变量的,所以对参数p来说,p的值没有改变
    但是
    void change _ prt(int * p)
    int * p;
    {
    *p = 10; // p的值也是没有改变的,只是改变了它指向的内存,以前的内存值1,现在是10
    }

    我修改后的代码,就是把该b头元素地址也昨晚一个指针。

    就比如,你有一个文件F,在其他地方生成一个快捷方式S1,你用S1打开文件修改内容并保存,
    在原始文件列表再打开F,看到的是修改后的内容

    现在的参数就相当于这个快捷方式S1传进去,生成一个临时变量S2,你在其中修改S2指向的路径,那跟S1完全没有关系
    (S1快捷方式还是指向你的文件F)

    不知道是否明白。

    修改后的代码,就是再F,S1,在加一个快捷方式SS1指向S1...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?