c++函数中的指针参数与地址参数区别介绍_C 语言

比如 一个函数 chat(link &a); chat(ling *a); 前者引入一个地址做形参 是不是可以把一个指针变量p。。 这么用chat(p); 那跟第二个函数 有什么区别呢 都是传地址啊。。 小弟弄不明白~~

chat(int&a); chat(int *a); 这两个函数是完全不同意义的东西,你的理解主要是在int&a和int* a这个类型上面。要注意int&和int*是两个完全不同的类型。int&是引用类型,而int*是指向int类型变量的指针类型。 void chat(int&a) { a=20; } 调用此函数: int x=100; chat(x); // 此时x的值变为20了 如果函数如下: void chat (int*a) { *a=20; } 调用: int x=10; chat(&x); //此时x的值也会变为20; 这是他们有联系的地方,也就是他们都可以在函数里面改变外面变量的值,但是这两个的参数传递方式是不一样的void chat(int&a)这个函数是引用传递,而void chat(int*a);这个函数是值传递(虽然其传递的值是地址值,但是还是值传递)。 这个引用类型应该怎么理解呢? 我是这样理解的:int a=100;那么a到底是个什么东西,我们说a使我们定义的一个变量,那么变量又是个什么东西呢,不知道你有没有想过,我们不谈编译原理,但是你可以将a看成是这么一个东西,a代表了一块内存空间,注意:是一块内存空间,也就是说这一块内存空间可能由一个或多个字节组成,那么在VC++ 6.0中,int类型的变量占4个字节,所以a代表了4个字节的连续的内存空间。那么int &b=a;定义了这一句之后,b和a一样都代表了那4个字节的内存空间了。再看看int *c=&a;此时c是什么呢?c也代表了一块内存空间,在VC ++6.0中int*类型的变量占4个字节的内存空间,所以c代表了一个连续的4个字节的内存空间,在其内部放的值就是a代表的那块内存空间的第一个字节的地址值。 所以我们向chat(int&a)传递参数的时候例如chat(x)此时a与x同样代表一块内存空间,而chat(int*a)调用的时候:chat(&x);此时a里面的值就是&x,也就是x代表的内存的首地址。 所以你要明白,他们不是传递的都是地址!!!!! 在C++中地址和引用不是一个东西!!!

时间: 2024-10-03 11:48:06

c++函数中的指针参数与地址参数区别介绍_C 语言的相关文章

关于C++使用指针 堆和栈的区别分析_C 语言

数据在内存的存放有以下几种形式 1.栈区--由编译器自动分配并且释放,该区域一般存放函数的参数值,局部变量的值等, 2.堆区--一般由程序员分配释放,如果程序员不释放,程序结束的时候才会被操作系统回收,3.寄存器区--用来保存栈顶指针和指令指针4.全局去--也是静态区,全局变量和静态变量都是存储在一起的,初始化的全局变量和静态变量都存储在一块,为初始化的全局变量和静态变量在相邻的另一个区域,程序结束后由系统释放.5.文字常量区--常量字符串就是放在这里的,程序结束后由系统释放,6.程序代码区--

C++中引用&与取地址&的区别分析_C 语言

C++中的引用&与取址&是很多初学者经常容易出错的地方,今天本文就对此加以分析总结,供大家参考之用. 具体而言,一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.      例如: int &rf; // 声明一个int型的引用rf &(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不

c语言中数组名a和&a详细介绍_C 语言

最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷> 先说说a和&a的区别(有三点,三个方向):1.是a和&a的本质,都是什么类型的.2.从2维数组的角度看.3.从指针运算的角度看. 声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧. 第一个问题:int a[10];  a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&

c++中typename和class的区别介绍_C 语言

相信学习C++的人对class这个关键字都非常明白,class用于定义类.在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字.它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template<typename T>...... 在模板定义语法中关键字class与

C++中抽象类和接口的区别介绍_C 语言

1. 如果一个类B在语法上继承(extend)了类A, 那么在语义上类B是一个类A.2. 如果一个类B在语法上实现了(implement)接口I, 那么类B遵从接口I制定的协议. 使用abstract class的根本原因在于, 人们希望通过这样的方式, 表现不同层次的抽象. 而interface的本质是一套协议. 在程序设计的发展中, 人们又发现接口可以用来表示对行为的抽象, 不过, 这只是interface的一种用法不是其本质. 理论结合实际才是最好的学习方式, 不过在这里, 我只想举一些我

解析wprintf 中使用%I64d格式化输出LONGLONG的详细介绍_C 语言

wprintf 中使用%I64d格式化输出LONGLONG 在写某个程序时,因为需要用到一个大的整数,就是要了LONGLONG型: 复制代码 代码如下: LONGLONG nLarge; 但是格式化时不知道应该用什么字符,用 %d,%l都不行.LONGLONGLONGLONG其实就是int64类型.在winnt.h可以看到: 复制代码 代码如下: typedef __int64 LONGLONG; 所以要想输出就要看__int64使用什么格式符了.通过查MSDN中,发现是:I64.在格式化输出则

向函数中传递指针和传递指针的引用的区别

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针:但 是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了   看个例子: #incl

c# c++ dll-C#调用C++和opencv生成的dll库文件,其中函数中带有指针

问题描述 C#调用C++和opencv生成的dll库文件,其中函数中带有指针 大家好,我用C#调用C++的dll,其中一个函数中有指针,参数的定义在C++中是一个结构体,但是我现在遇到的问题是无法获取托管类型的地址和大小,或无法声明指向它的指针,下面我把这个函数在C++中的定义和我自己转到C#中的定义给大家贴出来,大家帮帮忙,本人属于C++和C#新手. C++ 1. int THFI_Create (short nChannelNum,THFI_Param* pParam) 功能:初始化THFa

c语言-关于c++在函数中创建指针的两个问题

问题描述 关于c++在函数中创建指针的两个问题 解决方案 delete[] ps,是释放了ps指向的内存,但是并没有擦除原内存中的数据,所以在该内存未被写入其他数据之前,还能输出ps: cout<<&p,输出的并非指针(动态申请的地址),而是局部变量p的地址,所以不变(输出的栈地址) 解决方案二: 第一个问题: delete确实已经释放了ps所指向的那块内存,但所谓释放并不是清空,而是把那块内存重新回收到系统中,告诉系统这块内存又可以重新分配了. delete的时候,系统只是将指针指向