在学习C++中,对于指针方面的知识学习方面还是有一定难度的,相关概念也很晦涩难以理解,本人整理了相关的知识点已经本人的理解,希望可以得到大家的更正和帮助到你们的学习。
一:指针与地址
很多老师为了同学们能很快的理解和应用指针,往往会告诉大家:指针即地址! 其实我可以告诉你这是一个不严谨的说法,正确来说:指针是一个变量!变量本身会有系统给它分配一定的地址空间,而指针这个变量里面所存的值就是要指向的地址的值。这样说不知道大家有没有相对理解,指针本身也有占有地址空间,故有多重指针的出现,即指针里面存指针的地址,指向指针的指针。一般在32位的平台里,指针本身占4个字节的长度。
例如:int a = 1;
int *p = &a;
其中 int 代表变量的类型 ,* 代表定义的变量为指针,p为指针的变量名,p里面存的是变量a的地址,即p为指向a的指针。
二:指针常量和常量指针
1.指针常量:
指针常量其本质是一个常量,不可改变,是一个指针类型的常量,即始终指向同一个内存,指针常量不可以修改指针的值,但可以修改指向的内容,通俗的说就是指针常量保存的是一个地址是不能改的,一直指向这个地址,而可以通过该指针常量改变指向的那个地址里面的值或者内容。
定义:int a = 10;
int * const p = &a;
此时,p 里面将始终保存变量 a 的地址值,不可以改变,但可以通过 p 改变变量 a 的值,例如:*p = 30;(*p即为变量a)。
【 注意: * 在用的时候,除了定义指针时候,后面接变量的时候,可以理解为一个 取值符,取出该变量地址里面保存的值。而 & 一般在变量前面可以理解为 取地址符,即取出该变量所在的地址的值,在C++中有一个正规的叫法叫 引用 ,相应的在函数传参就有了 值传递 和 引用(址传递) 】
2:常量指针
常量指针其本质是指针,上面说到指针是一个变量,即常量指针本身是可以改变的,即可以指向不同的地址,而这个指针是常量类型的,代表的是指针一旦指向了某一块内存,则就不能通过常量指针来修改这块地址里面的值,与指针常量正好相反。
定义: int a = 10; b = 20;
const int *p = &a;(或者 int const * p 两者等价)
此时定义了常量指针 p ,p 可以指向 a 后再改变为指向 b ;但一旦指向 a 或者 b 后就不能通过 p 改变 a 或者 b 的值 例如: p = &b; (正确) *p = 30;(错误)
三:常量地址
1.常量地址与普通地址的区别在于:例如 int a = 10;这里 &a 就是普通地址。而 const int a = 10;这里 &a 就是常量地址 。
2. 注意: 普通地址可以初始化普通指针或者常量指针,而常量地址不能初始化普通地址,只能初始化常量指针。