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

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

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

 #include<iostream>
using namespace std;
void main()
{
int *i = new int();
cout << "调用前,i的地址:" << i << endl;
int a = ;
i = &a;
cout << "调用后,i的地址:" << i << endl;
cout << "调用后,i指向的值:" << *i << endl;
int b = ;
*i = b;
cout << "调用后2,i的地址:" << i << endl;
cout << "调用后2,i指向的值:" << *i << endl;
}

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

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

下面看例子:

1.使用指针形参

正确代码:

 #include<iostream>
using namespace std;
class test
{
int a;
public:
test(int n) :a(n) {}
void get(int* p) { *p = a; }//形参指向a的地址
};
void main()
{
test Q();
int *i = new int();
cout << "调用前,i的地址:" << i << endl;
Q.get(i);
cout << "调用后,i的地址:" << i << endl;
cout << "调用后,i指向的值:" << *i << endl;
}

不改变i的地址。

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

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

然后类比指针形参。

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

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

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

错误代码:

(1)

 #include<iostream>
using namespace std;
class test
{
int a;
public:
test(int n) :a(n) {}
void get(int* p) { p = &a; }//形参指向a的地址
};
void main()
{
test Q();
int *i = new int();
cout << "调用前,i的地址:" << i << endl;
Q.get(i);
cout << "调用后,i的地址:" << i << endl;
cout << "调用后,i指向的值:"<<*i << endl;
}

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

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

(2)

 #include<iostream>
using namespace std;
class test
{
int a;
public:
test(int n) :a(n) {}
void get(int* p) { p = &a; }//形参指向a的地址
};
void main()
{
test Q();
int i=;
cout << "调用前,i的值:" << i << endl;
Q.get(&i);
cout << "调用后,i的值:" << i << endl;
}

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

2.使用引用形参

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

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

c++形参改变实参(对指针的理解的更多相关文章

  1. C语言形参跟实参详解

    形参与实参今天我们来说下c语言形参与实参的区别,形参跟实参理解的话也很简单,但是好多同学关于这个知识点都是一知半解,没有真正的去透彻,一问都知道,但在真正引用的时候还会出现很多问题,而百度的时候又会说 ...

  2. 深入理解java的形参和实参

    转载声明:本文转载自公众号「码匠笔记」. 前几天在头条上看到一道经典面试题,引发了一些思考.也是写这篇文章的导火索. 背景 请看题: public    classMain{    publicsta ...

  3. 关于Java中形参与实参的理解

    今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.htm ...

  4. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  5. 关于Java形参和实参的理解

    源码地址:https://github.com/mynawang/javabasic-summary/tree/master/chapter01 1.方法的形参中,java的基本数据类型是传值调用,对 ...

  6. 嵌入式-C语言基础:理解形参和实参的区别

    #include<stdio.h> //实参:函数原型中声明函数后面带的参数 int test(int x)//函数原型 { //函数体 printf("test里面的x地址=% ...

  7. const形参和实参

    当形参是const时,必须要注意关于顶层const的讨论.如前所述,顶层const的作用于对象本身: const int ci=42;  //不能改变ci,const是顶层的 int i=ci:   ...

  8. C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习

    1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...

  9. C语言入门(8)——形参与实参

    对于带参数的函数,我们需要在函数定义中指明参数的个数和每个参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,并起一个符合标识符命名规则的名字.例如: #include <stdio. ...

随机推荐

  1. CodeIgniter_2 路由中定义伪静态 直接映射到相关的控制器

    某些情况下 隐藏路径信息 使用伪静态定义: RewriteRule ^no/torrent(.*)$ /index.php/torrent/doit/$1 CodeIgniter会自动识别到 no 控 ...

  2. scroll事件实现监控滚动条并分页显示示例(zepto.js)

    scroll事件实现监控滚动条并分页显示示例(zepto.js  ) 需求:在APP落地页上的底部位置显示此前其他用户的购买记录,要求此div盒子只显示3条半,但一页有10条,div内的滑动条滑到一页 ...

  3. ReactiveCocoa基础知识内容

    本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...

  4. js图形网站

    在做项目的时候难免会遇到要画各式各样的图形,这里推荐一个网站 http://echarts.baidu.com/doc/example.html 这个网站各种各样的图形都有,还有案例,相当不错

  5. IOS中十六进制的颜色转换为UIColor

    IOS中十六进制的颜色转换为UIColor #pragma mark - 颜色转换 IOS中十六进制的颜色转换为UIColor + (UIColor *) colorWithHexString: (N ...

  6. Java 往年试卷参考答案!!!

    仅供参考: 第一题: E C E A D D C A C A C A B A B C C D B C 第二题: True True False 11 12 13 14 No such file fou ...

  7. android Gui系统之SurfaceFlinger(2)---BufferQueue

    6 BufferQueue 上一篇已经说到,BufferQueue是SurfaceFlinger管理和消费surface的中介,我们就开始分析bufferqueue. 每个应用 可以由几个Buffer ...

  8. (转) 一步一步学习ASP.NET 5 (三)- 认识新的Web结构

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44421979 编者语 : 今天微软的两大盛事,早上 ...

  9. [css]我要用css画幅画(一)

    几年前开始就一直想用css画幅画. 今天才真正开始, 从简单的开始. 作为一个工作压力那么大的程序员,我首先要画一个太阳. html如下: <!DOCTYPE html> <html ...

  10. yii2搭建完美后台并实现rbac权限控制案例教程

    作者:白狼 出处:www.manks.top/article/yii2_frame_rbac_template 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...