十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1:计算机给每一个内存地址都进行了编码,以明确的表示内存的位置,这个编码就是地址,用来保存地址的变量就是指针;
成都创新互联成立于2013年,是专业互联网技术服务公司,拥有项目成都做网站、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元宾川做网站,已为上家服务,为宾川各地企业和个人服务,联系电话:18982081108
2:换句话说就是单独拿出一块空间(内存/变量)记录了原先变量的地址;
3:我们有了这个变量的地址(指针),那么我们就可以通过地址对这个变量进行操作,
目的:
因为C语言是值传递,在一个方法内修改变量的值,不会影响方法调用外的值,指针方便我们在不同函数之间对同一个变量就行操作;
c语言中指针即地址,地址的传值可以引起参数的变化。
比如:
x,
y是取这两个变量的地址,作用空间在main函数里。然后函数调用把这两个变量的地址传递到函数myadd中,在函数中的*a和*b分别是引用地址指向的变量值,等于是取到了x,y本身的值。在myadd中直接操作*a可以改变x的值。
通俗来说因为x,y表示的是x,y的地址。所以传递的是地址。意思就是说,函数可以通过地址引用变量。
值传递:指在调用函数时将变量的值传给函数。
地址传递:指在调用函数时将变量的地址传给函数。
指针:就是一个变量的地址。
C语言中,函数参数只能传值。与传值对应的是传引用,C语言不支持函数参数传引用,C++语言才支持。
C++传引用函数:
void foo(int a) { a = 3; }
假如a = 2,执行foo(a)后,a = 3。
---
C语言可以模拟传引用,方法是通过指针来实现:
void foo2(int* ap) { *ap = 3; }
假如a = 2,执行foo2(a)后,a = 3
foo2(a)调用本质上仍然是传值,只不过传递的是指针,指针即是地址,地址本质上是一个无符号整数。
如果:
void foo3(int b) { b = 3; }
假如a = 2,执行foo3(a)后,a = 2。这是因为foo3(a)调用过程中,a值传给形参b,修改b的值与实参a无关。
注意到,foo3(a)与上述foo(a)传引用的调用是形式一样的。
既然C语言通过指针可以实现传引用调用,为什么C++还要引入引用这个特性呢?这是因为C++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。
先举个简单例子:
#include iostream
using namespace std;
void Add1(int *a)
{
(*a)++;
}
void Add2(int a)
{
a++;
}
int main()
{
int x=1,y=5;
Add1(x);
Add2(y);
coutx" "yendl;
return 0;
}
输出:
2 5
这两个自加函数中,Add1是指针传递,Add2是数值传递,
在调用Add2(y)时,系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a++,却对y没有任何操作,故在函数调用结束后,释放a,而y没任何变化;
在调用Add1(x)时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与x是指向同一地址,即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作。a++时自然也对x++,当函数调用结束,指针a释放掉,x的值此时已经发生了变化。
这就是两者不同,地址传递的参数都是指针类型,于数值传递不一样。
至于选择那种传递,就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递。
还有什么不明白吗
*b是指针b指向的变量而不是地址,比如int *b=a,在这里并不是把a的地址赋给了*b而是赋给了b,这里是对指针变量b进行了初始化,在这里*是为了表明变量b是指针变量,以和整形变量区别,所以及很容易理解把a的地址a赋给b了。
数组名作为实参的时候,如果是一维数组,那么它传递的就是一维数组的第一个元素的地址,即数组首元素的地址;而若是二维数组,那么它传递的就是二维数组中第一个包含有若干列(有二维数组的第二个[ ]中的数字决定)即第一行的一维数组的地址;多维数组同理。。。