• c++形参改变实参(对指针的理解


    这几天搞逻辑比较晕,居然把指针的概念都混淆了。

    eg:int *p;//当然不对指针初始化在有些编译器是通不过编译的,比如VS(尤其是选中了SDL)

    指针p是一个对象,定义开始没有分配了内存空间,只是定义了一个指针而已。p存放的是对象的地址。

     1 #include<iostream>
     2 using namespace std;
     3 void main()
     4 {
     5     int *i = new int(0);
     6     cout << "调用前,i的地址:" << i << endl;
     7     int a = 9;
     8     i = &a;
     9     cout << "调用后,i的地址:" << i << endl;
    10     cout << "调用后,i指向的值:" << *i << endl;
    11     int b = 8;
    12     *i = b;
    13     cout << "调用后2,i的地址:" << i << endl;
    14     cout << "调用后2,i指向的值:" << *i << endl;
    15 }

    可见取地址运算符&改变了指针i的地址,使i指向a。解引用*,*i就是i存放地址的值。

    由于作业设涉及到用形参改变实参,特意的再探指针定义。

    下面看例子:

    1.使用指针形参

    正确代码:

     1 #include<iostream>
     2 using namespace std;
     3 class test
     4 {
     5     int a;
     6 public:
     7     test(int n) :a(n) {}
     8     void get(int* p) { *p = a; }//形参指向a的地址
     9 };
    10 void main()
    11 {
    12     test Q(2);
    13     int *i = new int(3);
    14     cout << "调用前,i的地址:" << i << endl;
    15     Q.get(i);
    16     cout << "调用后,i的地址:" << i << endl;
    17     cout << "调用后,i指向的值:" << *i << endl;
    18 }

    不改变i的地址。

    首先先明确一个问题。就是指针在定义时和使用时是不一样的。eg:int a=0;

    定义时是int*p=&a;定义后再次赋值是 p=&a;

    然后类比指针形参。

    void get(int *p),你要传进来的是一个指针,某个变量的地址也就是说,是一个值。

    所以当函数内部对同为地址(类型相同)的变量进行操作时,通过形参不能改变实参。

    而,如果语句块中写的是{*p=exp;}时,情况就不一样了。你要改变这个地址存放的数据了。

    错误代码:

    (1)

     1 #include<iostream>
     2 using namespace std;
     3 class test
     4 {
     5     int a;
     6 public:
     7     test(int n) :a(n) {}
     8     void get(int* p) { p = &a; }//形参指向a的地址
     9 };
    10 void main()
    11 {
    12     test Q(2);
    13     int *i = new int(3);
    14     cout << "调用前,i的地址:" << i << endl;
    15     Q.get(i);
    16     cout << "调用后,i的地址:" << i << endl;
    17     cout << "调用后,i指向的值:"<<*i << endl;
    18 }

    可见并没有成功,i的地址没有变化,值也没有变化为初始值3,不是2.

    *p看作一个整体,不然与值传递无异。 

    (2)

     1 #include<iostream>
     2 using namespace std;
     3 class test
     4 {
     5     int a;
     6 public:
     7     test(int n) :a(n) {}
     8     void get(int* p) { p = &a; }//形参指向a的地址
     9 };
    10 void main()
    11 {
    12     test Q(2);
    13     int i=0;
    14     cout << "调用前,i的值:" << i << endl;
    15     Q.get(&i);
    16     cout << "调用后,i的值:" << i << endl;
    17 }

     

    这个程序的意思是,i和Q.a共用一个地址。

    2.使用引用形参

     这个例子比较简单,也好理解。就不放了。

    总而言之,就是太过于形式化,不肯深入思考,探究清楚定义概念问题。

  • 相关阅读:
    Vue:对象更改检测注意事项
    Vue实现简易留言板
    CSS实现三级菜单[转]
    Vue 侦听属性
    Vue-列表渲染 非变异方法
    MYSQL/HIVESQL笔试题(七):HIVESQL(七)
    leetcode算法题基础(四十九) 树BFS
    数据结构基础(八)图Graph
    数据结构基础(七)优先队列 PriorityQueue, 堆Heap
    数据结构基础(六)树
  • 原文地址:https://www.cnblogs.com/yuelien/p/5395772.html
Copyright © 2020-2023  润新知