在C++之中,指针是一个变量用于存储另外一个变量的内存地址。指针可以指向各种数据类型例如基础数据类型和自定义数据类型等。
在计算机之中的内存被划分为一个一个的存储单元,每个存储单元拥有唯一的内存地址,指针就是指向这些内存单元的地址。
指针的声明:
可以使用*ptr对指针进行解引用,解引用之后输出的结果是指针指向的对象的值。
指针可以参与加减运算,例如:
在这个例子之中,数组名在一般情况下会隐式转换为指向数组首元素的指针。
输出的结果是:1,2
函数的传值:是指将实参的值传递给函数的形参,并且不改变实参原来的值,例如:
函数的传址,则是将实参的地址传递给函数的形参,由于指向的是同一个内存空间,所以在函数之中对形参进行修改也会修改函数实参的值,例如:
//函数传指针(传址)
#include<iostream>
using namespace std;
void func(int* num){
*num+=10;
cout<<"经过函数的操作,num的值为:"<<*num<<endl;
}
int main(){
int value=10;
func(&value);
cout<<"经过函数的操作,value的值为:"<<value<<endl;
return 0;
}
另外,通过传引用也能达到这种效果达到效果:
老规矩,我们开始思考C#与C++的区别,在C#之中虽然也可以使用指针,但是一般使用指针是函数处于一种不安全的模式之下,所以我们一般不考虑C#的指针使用。
对于函数的传值,C#之中也是将实参的值传递给形参,并且对函数之中的形参进行操作不会影响实参的值,这一点和C++相同。
对于函数的传址,在C++之中,是通过传递指针,这样形参和实参都是修改同一个内存地址所以形参的改变也会影响实参。在C#之中我们使用ref和out进行这部分的操作,使得形参的改变会影响到实参的改变。
但是在C#之中使用ref 和out对实参的修改比在C++之中使用传址的方式更加安全,由于在使用ref和out的时候,编译器会对这部分进行检查,相对来说比较安全,但是C++之中如果操作不当,就会出现悬空指针的情况,所以使用C++进行传址的操作时需要小心。