• C语言中和指针相关的四道题目


    例子1.

    void fun (int *x , int *y) {
      printf("%d, %d", *x, *y) ;
      *x = 3;
      *y = 4;
    }

    main()
    {
    int x = 1, y = 2
    fun(&y, &x);
    printf("%d, %d", x, y);
    }


    结果
    2, 1
    4, 3

    注意main在调用fun函数时, y 和x故意写颠倒了。

     --------------------------------------------------------------

    例子2. 

    #include <stdio.h>
    void swap(int *p1, int *p2)
    {
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
    }

    main()
    {
    int a, b;
    int * p1 = &a, *p2 = &b;
    scanf(%d %d, p1, p2);
    swap(p1, p2);
    prinf("%d, %d", *p1, *p2);
    }

    如果在控制台输入  2 和 5

    则输出结果为 

    5, 2

    原因: 在调用swap函数时使用了职称,所以在swap函数内部对p1,p2 所引用的内容值的修改,会影响外面的a和b的值。

     --------------------------------------------------------------

    例子3:

    #include <stdio.h>
    void swap(int *p1, int *p2)
    {
    int *temp;
    temp = p1;
    p1 = p2;
    p2 = temp;
    }

    main()
    {
    int a, b;
    int * p1 = &a, *p2 = &b;
    scanf(%d %d, p1, p2);
    swap(p1, p2);
    prinf("%d, %d", *p1, *p2);
    }

    和2不同, swap函数中的temp为指针,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.

    但最后的打印结果仍为
    2,5


    原因是:虽然main中调用swap函数时使用了指针传递,但swap函数中的所有操作都是:将指针本身的修改,而没有再次使用*操作符来修改“指针指向的内容值”

    ---------------------------------------------------------------------

    例子4:

    #include <stdio.h>
    void swap(int *p1, int *p2)
    {
    int *temp;
    *temp = *p1;
    *p1 = *p2;
    *p2 = *temp;
    }

    main()
    {
    int a, b;
    int * p1 = &a, *p2 = &b;
    scanf(%d %d, p1, p2);
    swap(p1, p2);
    prinf("%d, %d", *p1, *p2);
    }

    和2很像。但唯一不同是,temp定义为指针而不是普通变量。看上去似乎应该和2的输出结果一样,仍为
    2,5 。

    但实际运行时编译器会报错:非法的内存写入。

    原因是:temp为野指针,并没有预订指向哪里。如果指向系统区,则可能导致操作系统死机。

    如果temp在定义后,马上给一个初始值,就不会有问题了。

  • 相关阅读:
    BZOJ 1911: [Apio2010]特别行动队
    BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)
    BZOJ 2243: [SDOI2011]染色(树链剖分)
    BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)
    BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分)
    BZOJ 1875: [SDOI2009]HH去散步(矩阵乘法)
    BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼(矩阵乘法)
    BZOJ 2463: [中山市选2009]谁能赢呢?(博弈论)
    BZOJ 2879: [Noi2012]美食节
    BZOJ 1070: [SCOI2007]修车(费用流)
  • 原文地址:https://www.cnblogs.com/kungfupanda/p/4162040.html
Copyright © 2020-2023  润新知