C++漫谈指针
(一)指针的概念概括
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,所以我们可以把它简单滴认为是一个只能存储地址的变量。
如果要搞懂指针,我们需要搞懂4方面内容:
- 指针的类型
- 指针所指向的类型
- 指针的值
- 指针本身所占据的内存区。
比如看这段代码来理解指针的类型:
int* p = &m;
这时,指针的类型就是int*,其实就是指针名前面的东西,它代表了指针本身的类型。
至于指针所指的类型,你只要把指针的类型的星号去掉就可以了,比如上面那个指针所指的类型就是int。指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待,这在指针运算中是十分重要的。指针运算的内容可以参考这篇文章。C++漫谈指针运算
至于指针的值,指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个普通的数值,这也就是指针变量的特别之处。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指的类型)的内存区。
既然指针是一个变量,那么它所占的存储空间是多少呢?对于这个问题,我们可以用sizeof()来计算出他的大小:
#include <iostream>
using namespace std;
int main() {
int m = 5;
int* p = &m;
cout << sizeof(p) << endl;
}
结果很显然,在32位系统上,一个int指针占的内存是4个字节。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。如果是64位系统,那么一个int指针所占的内存将会是8个字节。
(二)指针的使用
讲了这么多概念,那么指针究竟该怎么使用呢?我们还是拿上面那段代码说事:
#include <iostream>
using namespace std;
int main() {
int m = 5;
int* p = &m;
cout << sizeof(p) << endl;
}
首先我们有一个整型变量m,他的值是5,然后我们声明了一个int*类型的指针去指向他。&是取址符,取出m所在的地址并且赋值给p,这样p中就保存了m的地址,也就成为了m的指针。然后指完了它又有什么用呢?比如我们可以通过指针p来访问m的值:
cout << *p << endl;
这里的星号是解引用,可以将地址中存储的值取出,当然,我们也可以通过这个方法去修改m的值:
*p = 6;
你会发现,我们没有通过m就修改了m的值(此时m应该是一脸懵逼的),这就是指针的灵活之处。那么,这又有什么用呢?这个用法和函数参数有关,我在这里先放一个简单的例子,大家自行体会,具体内容我会在另一篇文章中阐述:
#include <iostream>
using namespace std;
void swap(int m, int n) {
int temp;
temp = m;
m = n;
n = temp;
}
int main() {
int a = 1;
int b = 2;
swap(a, b);
cout << a << endl << b << endl;
}
调用函数后发现,这个交换函数并没有起到任何作用。于是我们换上我们的指针试试:
#include <iostream>
using namespace std;
void swap(int* m, int* n) {
int temp;
temp = *m;
*m = *n;
*n = temp;
}
int main() {
int a = 1;
int b = 2;
swap(&a, &b);
cout << a << endl << b << endl;
}
两个数被成功交换了,大家自行体会一下,注意联系指针的概念和本质哦。
(三)指针与const运算符
这里有2容易混淆的概念,即指向常量的指针和常量指针。事实上我们可以记住他们的英文名:
常量指针(pointer to const)是说这个指针是一个普通的指针,它指向了一个常量,如果你愿意,它也可以指向其他对象,并且可以令一个指向常量的指针指向另一个非常量。
指针常量(const pointer)是说这个指针本身就是一个常量对象,所以它不能指向其他对象,但是不意味着它不能改变所指向对象的值。
下面是一个常量指针(指针所指的变量不能修改):
int m = 9;
const int* p = &m;
*p = 1; //非法
下面是一个指针常量(指针本身的值不可修改,也就是说它不能指向别的变量):
int m = 9;
int n = 1;
int* const p = &m;
p = &n; //非法
好了,本教程就到此结束啦,喜欢的小伙伴记得点赞哦,也欢迎志同道合的朋友们关注我和我一起交流。
2019年4月8日