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

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. JavaScript中数组的增删改查

                                               数组的增加 ary.push()   向数组末尾添加元素,返回的是添加后新数组的长度,原有数组改变 ary.uns ...

  2. Struts2详细教程

    Struts2详细教程:http://www.yiibai.com/struts_2/

  3. javascript 对象初探(二)--- 返回对象的函数

    除了使用new操作符调用构造函数以外,我们也可以抛开new操作符,只用一般函数来创建对象,这样就能执行某些预备工作,并已对象为返回值的函数.. function her(){ return { nam ...

  4. 【Leafletjs】4.L.Map 中文API

    L.Map API各种类中的核心部分,用来在页面中创建地图并操纵地图. 使用 example // initialize the map on the "map" div with ...

  5. Sharepoint 2010 工作流启动时处理表单出错

    问题: Shareoint 2010 列表工作流启动时,显示“处理表单时出现严重错误”. Error Message-1: Object doesn't support property or met ...

  6. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q81-Q83)

    Question  81You are designing a custom administrative timer job for a SharePoint 2010 farm. You need ...

  7. %1$s,%2$s等的用法

    String.format(String format, Object... args)方法中:   format:格式字符串. 如:%1$s,%1$d,%2$s...                 ...

  8. Android项目实战(二十二):启动另一个APP or 重启本APP

    一.启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP,这些小APP是整合了Unity的,但是还是android程序(所有小APP的包名是已知的). 以前没做过,查询了一下实现方法 ...

  9. Android 隐式意图的配置

    本文地址:http://www.cnblogs.com/wuyudong/p/5677473.html,转载请注明源地址. <Android 显示意图激活另外一个Actitity>一文介绍 ...

  10. 【代码笔记】iOS-单例

    一,工程图. 二,代码. NetManager.h #import <Foundation/Foundation.h> @interface NetManager : NSObject + ...