1.指针概念

指针也是一个值,只不过他的值对应的是指向变量的地址,指针也有地址,有内存,改变指针指向的变量,他的值就会发生改变(因为指向的地址发生改变),但是他的地址没有发生改变。

2.指针的注意事项

指针可以指向任何变量,int,double,long,vector等,如果设置了一个int*p1的指针,但指向的是一个double类型的变量就会报错,指针指向的变量内存不同但是指针的内存是固定的,就比如你指向一个int类型的变量和指向一个long类型的变量,两个变量内存不同,但是指针的内存始终是固定的。

3.利用指针通过解引用获取变量的值

创建student_score这个变量,创建*score_ptr这个空指针,打印score_ptr的值为0,通过&符号可以获取score_ptr这个指针变量的地址,用&符号获取student_score的地址并赋值给score_ptr,此时在打印score_ptr的值是student_score的地址,通过在指针前面加*号利用解引用就可以获得student_score的值了,注意指针的地址始终是没变的,在此过程中。

4.通过指针去改变值

创建n,b两个变量,以及ptr这个空指针,用&符号将n的地址赋给ptr,打印n和*ptr,输出的都是15,打印ptr和&n,输出的也都是一样的,都是n的地址。通过&符号将b的地址赋给ptr,此时指针ptr的指向从n变为了b,同理打印b和*ptr,输出的都是2,打印ptr和&b输出的也一样,都是内存b的地址。

5.用指针去指向vector容器

初始化一个int类型的vector,初始化一个指向int类型容器的指针,初始为空指针,仍然是通过&符号获取vec的地址并赋值给ptr,我们用for循环去遍历容器,无论是*ptr还是vec效果都是一样的。

6.在堆上分配内存

创建一个空指针int_ptr,使用new函数给int_ptr分配一个内存空间,继续创建一个空指针,使用new函数通过new int [size],在堆区中创建一个数组并赋值给arr_ptr,注意使用完之后一定要释放数组内存,并将arr_ptr继续为空指针,防止悬空。

7.指针与数组的关系

创建一个数组,打印数组名得到的是数组第一个元素的地址,在数组名前面加入一个*号继续打印就得到了数组的第一个元素,此功能跟指针很相似,通过[]加入索引可以访问数组中的元素,由于arr数组名是第一个元素地址,arr+1代表着第二个元素的地址以此类推。初始化一个指针p,把arr赋给指针p,为什么能赋给呢,因为arr数组名代表第一个元素的地址。

8.const常量与指针的用法

指针与常量一共三种用法:常量指针,指针常量,常量指针常量。

对于 const int*p{&a}代表着指针p指向的变量a为常量无法修改,所以无法直接对a那块地址的值进行修改,无法使用解引用,但是指针是可以指向别的int地址的。

对于int*const p{&a}代表着指针是常量,指针指向一个变量地址后无法在修改,代表着指针无法指向别的变量了,已经固定了,所以无法把别的地址赋予给他

对于const int*const p{&a}代表着无论是指针还是指针指向的变量都无法修改,上面的功能都无法实现。

9.使用指针去传参

图中的函数传递参数不在是变量值,而是变量地址。函数也可以传数组,由于上文说过数组名相当于数组第一个元素的地址,因此可以把数组当做指针直接传进函数。

10.函数返回指针,以及堆区与栈区的运作

最开始在栈区,main函数导进来,初始化size,value两个变量以及new_arr这个指针,给size,value赋值传给creat_arry函数中,注意创建creat_arry这个函数时Int *creat_arry代表着返回指向int类型的指针,creat_arry进入栈中,初始化new_storage这个指针,使用new在堆区中创建一共数组并将数组的地址传给new_storage指针,此时new_storage指向这个堆区数组。通过for循环将初始值赋给数组,最后返回new_storage的指针,并将此指针赋给new_arr这个指针中,函数执行完毕,栈区释放函数,new_storage指针不在指向自己创建的堆区中,而new_arr的指针再次指向此堆区。展示new_arr的数组,注意最后一定要用delete [] new_arr;来释放内存,不然main函数执行完毕后就会有个堆区内存占着内存。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐