在选择中迷失自我
C++ 地址和指针
开发工具与关键技术:C++、VisualStudio 作者:何任贤 撰写时间:2019年04月10日 123 C++的地址并不是我们日常生活中的地址,那么它是什么呢,它是指我们内存中地址,就内存的位置,我们C++中的变量,常量都是有自己地址的,不过只有有标识的才有地址,下面我们输出一下常量和变量的地址。 1#include using namespace std; void main() { const int a = 10; int b = 10; cout << “a的地址:” << &a << “\n” << “b的地址:” << &b << “\n”; } 这是代码,&符号在这里是取地址的意思,就是获取该标识所在内存地址的意思。下面它们的地址.
地址既然是它们所在内存的位置标识,那么我们是不是下一次就可以通过这个地址来获取a和b的值呢?其实并不可以,因为只有在程序运行的时候编译器才会给它们分配内存,所以并不是,每次内存分配都是不一样的,那么在程序运行时可不可以改变标识的地址呢?其实并不可以,为什么呢?因为地址本来就是一开始就分配好,那么我们只能改变地址存储的值,而不是地址,为了验证每次内存分配都是不一样的,我们下面有代码和结果,至于改变某个标识的地址,这个C++没有相关代码。 我们通过结果可以知道,编译器每一次分配的内存都是不一样的,不管它是常量还是变量,既然每一次都是不一样的地址,那这个地址有什么用呢?我们可以看一下标题,地址和指针,为什么是地址和指针,很简单指针就是用来操作地址的,指针也是一种数据类型,它是用来存储地址的,它可以通过地址来获取该地址的值,那么它怎么获取,为什么只有指针可以通过地址获取地址的值呢?下面我们来看代码和结果。 #include using namespace std; void main() { int a = 10; int *b ; b = &a; cout << “a的地址:” << &a << " a的值:" << a << “\n” << “指针b的值:” << b << " 指针b解地址:" << *b << “\n” << " 指针b的地址:" << &b << “\n”; } 通过代码和结果我们看到指针b的值和a的地址是一样的,这就是为什么我说指针是用来存储的地址的,指针b解地址,解的是那个地址呢,解的是它存储的地址而不是它的自己的地址,它地址解出来的和a的值是一样,上面我们还说过只有指针才能解地址是吧,我们看下面的截图就知道了。(*符号在变量声明时是修饰该变量是一个指针,在非声明时一般是解址符) 在截图中我给a赋了上面的地址值,加上0x是表示该值是一个十六进制的数,地址是以十六进制显示的,然后我尝试对a进行解地址,编译器就报错了,这错的意思解址符的操作对象必须是指针。 那么指针操作的是地址一个变量就一个地址,并不能显示指针对地址的操作,那么什么凸显指针对地址的操作呢,这个时候我们要加入一个数组,为什么是数组呢?因为数组在内存中是一片连续的内存,虽然不只数组一个可以体现,但是数组大家都比较熟悉。下面数组的下标操作和指针对数组的操作。 #include using namespace std;
void main() { int a [10]; int *b; for (int i = 0; i < 10; i++) { a[i] = i; } for (int i = 0; i < 10; i++) { cout << a[i] << " " ; } cout << “\n”; } 上面的代码是利用数组的下标给数组循环赋值和输出,结果是 那么我们利用指针一样可以获得相同的结果,下面利用指针对数组进行赋值和输出 void main() { int a [10]; int *b; b = a; for (int i = 0; i < 10; i++) { *(b + i) = i; } for (int i = 0; i < 10; i++) { cout << *(b + i) << " " ; } cout << “\n”; } 输出结果也是和上面一样,没有什么区别。
为什么指针也可以呢?那是因为数组是一片连续的内存对吧,那么既然是一片连续的内存,那么它们的地址肯定也是连续的,因为a数组是有十个元素的,而数组的索引是从零开始的,a 等于是a数组的第一个内存,a就是a[0]的地址,所以指针可以遍历数组的所有元素,也就可以对数组元素的值进行改变和输出。所有地址就是给指针来操作的。