C++——指针
一、指针的定义
1 int *p; 2 int* p; 3 int * p; 4 int*p;
首先可以肯定的是上述四种写法(未初始化)都是可以的(本人推荐第一种,不因为什么,看着舒服!!!😊无论采用哪一种,一定不要变来变去),接下来就是指针的定义,啥呢,其实它也是变量,别人存数据,它不!,它存数据的地址(就像你家的门牌号)。
指针是C++中一种复合类型变量,类似于引用,指针也可以对其他对象间接访问。但其不同于引用:
1、指针本身就是一个对象,在其生命周期内可以先后指向不同的对象;
2、指针无需初始化(建议初始化指针,哪怕生成空指针e.g., int *p = 0; int *p = NULL;(在头文件中定义cstdlib) int *p = nullptr;(C++11新引入的方法))
1 int a = 0; 2 int *p = &a;
以上为指针的初始化定义,后续使用中可做修改。
二、变量的内存分配
int a = 0; 当我们敲下这一行代码时,系统会开辟出一片内存空间,大小正好是int类型所需的大小(4Byte),系统看到声明符“a”,于是给这片空间命名为a同时初始化为0。
当我们想知道这片空间的地址所在何处时,我们可以通过取地址符&获取a的地址(首地址)。 std::cout << &a << std::endl;
int *p = &a; 当我们敲下这一行代码时,系统同样会开辟出一片内存空间,大小是(int *)所需的大小(32位—4Byte;64位—8Byte),而看到声明符p,于是这片空间就叫p吧。而&a也就是将a所在空间的地址(首地址)赋给p。
此时p为指针变量,指向a的地址;*p为int变量,指向a。执行下面的代码:
1 #include <iostream> 2 3 int main(int argc, char * argv[]) { 4 int a=0; 5 int *p=&a; 6 std::cout << p << std::endl; 7 std::cout << *p << std::endl; 8 }
可得到如下结果:
1 0x6237bffaf4 2 0
三、指针与数组
数组是一种类似于vector的数据结构,但是性能与灵活性远不如vector(数组的大小固定)。在C++中,指针与数组有着十分密切的关系,编译器一般会将数组转换为指针。
int a[10]; 当敲下这一行代码时,此处a实际上是一个指向数组首元素的指针变量。但a(指针常量)不同于其他的指针变量,一旦定义便无法改变,只能指向数组的首元素。
四、常量指针与常量指针
C++中利用const关键字定义一个变量时,必须初始化变量,后续也无法修改。以下两种概念无法区分,看懂代码即可。
指针常量: int * const p=&a; ,此处可以发现修饰符*修饰const p,而p是指针变量,因而此处的p是指针常量。一定要初始化。
常量指针: int const *p; ,此处*仅修饰指针变量p,const修饰*p,也就是指针变量p所指向的对象(无法修改),因而是常量指针。
五、指针的指针
1 int a=0; 2 int *p=&a; 3 int **P=&p;
第1行定义int类型变量a,初始化为0;第2行定义指针变量p,初始化为a的地址&a;第三行定义指针变量,初始化为指针变量p的地址。
难以理解可编写代码输出各变量。
六、参考
1、c++指针(一)——指针的定义以及写法_大豆木南的博客-CSDN博客_c++ 指针定义
2、c++指针(三)——指针和数组名的关系_大豆木南的博客-CSDN博客
3、c++指针(四)——指针常量和常量指针_大豆木南的博客-CSDN博客
4、C++ Primer(中文版/第五版):P47(2.3.2--指针);P105(3.5.3--指针与数组)
本文作者:有梦-
本文链接:https://www.cnblogs.com/hjxiamen/p/16739935.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步