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

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. Elastislide - 响应式的图片循环展示效果

    Elastislide 是一款非常优秀的响应式 jQuery 图片循环展示(旋转木马)插件,集成了 Touchwipe 插件以支持触屏设备.提供了四种效果:水平图片传送带.垂直图片传送带.固定在屏幕底 ...

  2. Photopile JS – 帮助你实现精致的照片堆叠效果

    Photopile JS 是模拟照片散布堆叠在一起的 JavaScript/jQuery 图片库.点击缩略图,照片会弹出放大 ,再次点击照片会返回.缩略图是可拖动的,允许照片深深的堆在一起而不被覆盖, ...

  3. jQuery Label Better – 友好的表单输入框提示插件

    jQuery Label Better 帮助你标记您的表单输入域,带有美丽的动画效果而且不占用空间.这个插件的独特之处在于所有你需要做的就是添加一个占位符文本,只有当用户需要它的时候才显示标签. 您可 ...

  4. jQuery立体式数字滚动条增加

    1.html结构 <div class="numberRun1"></div> 2.js <script type="text/javasc ...

  5. JavaScript基础20——element对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. GRID方式ALV导出数据到本地丢掉最后一位的问题

    这是SAP的一个Bug,FM方式ALV Grid和Class ALV Grid都会出现,但是ALV List好像没有这个BUG.   在以下几个条件满足的时候就会出现这个问题: 1.字段对应的域Con ...

  7. 对于Access数据库查询遇到空值的解决办法

    1.Access数据库在office环境下对于null是识别的,但是,在开发环境下,Access数据库对于where xxx is null是不识别的. 2.查询空值解决办法:select * fro ...

  8. 操作系统开发系列—12.a.从Loader到内核 ●

    Loader要做两项工作,我们先来做第一项,把内核加载到内存: 1.加载内核到内存. 2.跳入保护模式. 首先编译无内核时: nasm boot.asm -o boot.bin nasm loader ...

  9. Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

    一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...

  10. DOM 节点操作

    一.获取节点 方法名 只能document调用 返回单一的值 返回动态集合 getElementById √ √ getElementsByTagName √ getElementsByClassNa ...