C++指针运用

C++指针运用

前提:
计算机里,内存调取变量,需要知道变量的物理地址相当于现实生活中的地标,当锁定地标之后,进程从内存调用变量时才能做到精确无误。
而我们指针就提供了地标值,哲学上通俗的说,在一定时间内地标值精确的代表了一栋房子,我们可以说当我们说起地标值,就相当于说起了房子,当我们说起了房子,也就是地标值。
指针———地标值———房子,就这样,三位一体,连体婴儿,你就是我,我就是你。
现在我们再看指针的定义
指针:是所定义的变量的地址容器(或者抽象地说它代表变量)
指针———地址———变量,就这样三位一体,连体婴儿,你就是我,我就是你。
指针到坐标值与指针到地址,可以实际联系在一起,
但是上升到房子和变量时,需要抽象相等。
就像你和身份证一样

计算机如何获取变量的地址?
加入&符号代表了取a变量的地址

int a = 1;
std::cout << &a;``

打印出来的结果是一串整数,
说明指针/地址是其实是一串无符号的整数。
这串整数是cpu将进程里的变量分配在内存这个硬件上随机的物理位置。
而怎么分配才能让我们掌控,才合理,才高效?操作系统说了算,这就扯远了。

这是大前提,
当我们去接收对应类型的变量的地址时,我们要创建对应类型的存储变量地址的容器(指针)PS;之后都用指针来代替。

int a = 10;
int* p = &a;

同理推广到数组

int a[10];
int* q = &a;//存储数组a的首地址,也就是第一个元素地址
//c++星号写在数据类型后,代表整形指针类型
int* p = &a[5];//存储数组a第6个元素地址,数组下标从0开始

同理既然p代表了a[5]的地址,抽象的代表了a[5],
由于数组连续存放,p+1就是a[6]
(ps: a+5等价于&a[5])
如果在指针前加星号的话,代表取当前指针所容纳地址的那个变量的值。
通俗点说,就是指针一旦加上了星号(*p),*p就不是抽象的代表a[5]了,*p就是a[5]

同理*(p + 1)就是a[6]

函数参数的指针变量

经过我们上面所知道的,指针变量作为地址的容器,存储的是一串无符号的整数,当函数传参时,作为值传递的话,相当于复制该值。将该值的副本传过去了,我自己本身没有改变。
打个比方:我告诉别人我的思想,别人接受了我的思想进行了自己的创作变成他自己的想法,别人把我的想法改变了,但是我的思想没有变。

void change(int x){
    x = 233;//
}
int main(){
int a = 1;
change(a);
std::cout << a;
}//此时a值打印出来是1,我的思想并没有变

如果要让a值改变,需在传参时加入&符号,作为引用
意为将给传入的a取别名为x,对x改也就是对a改

void change(int &x){
    x = 233;//
}
int main(){
int a = 1;
change(a);
std::cout << a;
}//此时a值打印出来是233,a改变了

与取地址符&不同
和类型在一起的是引用,和变量在一起的是取址
int* &p出来,&就是代表引用
接下来
我们讲点题外话
我们只看&p,&p是指取指针p的地址,p作为地址容器只存了变量的地址,如果它也要拥有姓名的话,再设个指针q指向它,那它作为存储变量地址的容器,那么它也有地址了,q作为容器存着p这串无符号整数的地址,一环套一环,一环套一环,,,无穷尽也。
究其本源在于这串无符号整数它既能作为是某个地方的坐标值,又能作为坐标值的坐标值,如果我叫张进,那张进作为一串名字也要拥有它自己的标签,标签也要拥有自己的标签,,,标签也要拥有自己的标签,,,,,仿佛回到了哲学本源,我究竟是谁,我叫张进,而张进又是谁呢????
如果一直定义下去,还有三级指针,四级指针,五级指针。。。。。

下面再给三个例子来证明&作为引用符的用处,还是那句话

和类型在一起的是引用,和变量在一起的是取址

类型一:

void change(int* p){
	*p = 233;//*p等同于a
}
int main(){
int a = 1;
int* p = &a;
change(p);
std::cout << a;
}//此时a值会从1变为233

类型二:

void change(int* p){
	int b = 233;
	int* q = &b;
	*p = *q;//不加引用,需要加*p来等同于a,然后用*q(b)去替换*p才能转换,
}
int main(){
int a = 1;
int* p = &a;
change(p);
std::cout << a;
}//此时a值会从1变为233

类型三:

void change(int* &p){
	int b = 233;
	int* q = &b;
	p = q;//加了引用之后,改p的地址就相当于改a的地址
}
int main(){
int a = 1;
int* p = &a;
change(p);
std::cout << a;
}//此时a值会从1变为233
发布了19 篇原创文章 · 获赞 4 · 访问量 501

猜你喜欢

转载自blog.csdn.net/qq_35050438/article/details/103213496