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

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. 12款免费的响应式 WordPress 主题下载

    响应式和现代设计风格的多用途 WordPress 主题能够非常灵活的适应所有设备.而高级主题能够更轻松定制,您可以从主题选项中禁用/启用响应模式.多用途的响应式设计的主题是最适合杂志网站,博客网站,想 ...

  2. Subway Icon Set – 306个像素完美的特制图标

    这个图标集是306个优化的像素完美,精雕细琢的图标.为这些设备进行了优化:iOS.Windows Phone.Windows 8 and BlackBerry 10,提供 PNG, SVG, XALM ...

  3. 【zepto学习笔记02】零碎点

    前言 上次我们看了zepto的选择器方面的东西,其实zepto简单很大程度是因为他用了最新的检索器querySelectorAll,今天我们来学习下zepto的一些零碎点的地方吧,主要根据zepto官 ...

  4. C#仿google日历asp.net简单三层版本

    网上搜了很多xgcalendar的例子都是Php开发的,而且官方站上的asp.net/MVC版 在vs10 08 都报错. 所以自己重新用三层写了一下希望对大家有帮助 废话不多说了 先看看它都有些什么 ...

  5. jQuery静态方法type使用和源码分析

    jQuery.type方法是检测数据类型的工具方法,在分析其用法之前先总结下js给我们提供了那些监测数据类型的方法: 一.typeof 操作符 下面是测试代码 var data=[],a='123', ...

  6. Oracle EXP-00091的解决方法

    [sql] EXP-00091: 正在导出有问题的统计信息.www.2cto.com . . 正在导出表                      WF_GENERAL导出了 EXP-00091: 正 ...

  7. 如何申请Autodesk ReCap 360 photo的云币(Cloud Credit)

    在之前的博客中我介绍过Autodesk的照片建模云服务—Autodesk ReCap 360 photo,通过Autodesk ReCap 360 photo,你可以非常方便的通过照片生成三维模型.如 ...

  8. Round in Oracle/VBA

    VBA的 Round采用的是银行家算法(rounds to the nearest even number) Round(1.5) = 2 Round(0.5) = 在Oracle中实现银行家算法 S ...

  9. 【代码笔记】iOS-看图听声音

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFo ...

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

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