c++形参改变实参(对指针的理解
这几天搞逻辑比较晕,居然把指针的概念都混淆了。
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++形参改变实参(对指针的理解的更多相关文章
- C语言形参跟实参详解
形参与实参今天我们来说下c语言形参与实参的区别,形参跟实参理解的话也很简单,但是好多同学关于这个知识点都是一知半解,没有真正的去透彻,一问都知道,但在真正引用的时候还会出现很多问题,而百度的时候又会说 ...
- 深入理解java的形参和实参
转载声明:本文转载自公众号「码匠笔记」. 前几天在头条上看到一道经典面试题,引发了一些思考.也是写这篇文章的导火索. 背景 请看题: public classMain{ publicsta ...
- 关于Java中形参与实参的理解
今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.htm ...
- [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参
个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...
- 关于Java形参和实参的理解
源码地址:https://github.com/mynawang/javabasic-summary/tree/master/chapter01 1.方法的形参中,java的基本数据类型是传值调用,对 ...
- 嵌入式-C语言基础:理解形参和实参的区别
#include<stdio.h> //实参:函数原型中声明函数后面带的参数 int test(int x)//函数原型 { //函数体 printf("test里面的x地址=% ...
- const形参和实参
当形参是const时,必须要注意关于顶层const的讨论.如前所述,顶层const的作用于对象本身: const int ci=42; //不能改变ci,const是顶层的 int i=ci: ...
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习
1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...
- C语言入门(8)——形参与实参
对于带参数的函数,我们需要在函数定义中指明参数的个数和每个参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,并起一个符合标识符命名规则的名字.例如: #include <stdio. ...
随机推荐
- ASP.Net之数据绑定
---恢复内容开始--- [概述]数据绑定是指从数据源获取数据或向数据源写入数据.简单的数据绑定可以是对变量或属性的绑定,比较复杂的是对ASP.NET数据绑定控件的操作 1.简单的属性绑定 基于属性的 ...
- knockout源码分析之computed(依赖属性)
一.序列图 二.主要代码文件 1.dependentObservable.js:主要包含ko.computed相关方法的处理2.dependencyDetection.js:主要包含依赖的监控上下文对 ...
- 1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车
最近一直在使用vue.js来构建项目,先分享一下一些简单可复用的函数. 1:时间戳转换Date.prototype.format = function(fmt){ //author: yumeiqia ...
- 从零开始,做一个NodeJS博客(二):实现首页-加载文章列表和详情
标签: NodeJS 0 这个伪系列的第二篇,不过和之前的几篇是同一天写的.三分钟热度貌似还没过. 1 静态资源代理 上一篇,我们是通过判断请求的路径来直接返回结果的.简单粗暴,缺点明显:如果url后 ...
- iOS 适配iOS9
1.网络接口不支持https协议,在iOS9下 在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据. 解决方案(以下方法2选1): (1)暂时退回到http协议 ...
- Android悬浮窗实现 使用WindowManager
Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 ...
- ios网络编程学习
//网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...
- 【代码笔记】iOS-淡出淡入效果
一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIVie ...
- iOS--(UITableViewCell)、(UITableViewController)微信个人主页
本文主要实现了微信的个人主页的设置: 目录文件如下: 实现代码如下: RootTableViewController.h #import <UIKit/UIKit.h> @interfac ...
- Web性能--TCP的构成
前言:阅读<Web性能权威指南>摘录笔记.在这本书开篇就读到第一句话令人印象深刻: "合格的开发者知道怎么做,而优秀的开发者知道为什么那么做". 内容大纲: 1.因特网 ...