很早以前写了一篇关于c++多级理解。当时写的不是很清楚,今天补充说明下。
1 首先我们的内存都是一块一块的内存组成的,并且每个内存都有相应的一个地址和存贮的数据。
那么指针就是用来描述这个地址的。
如下图:
上图中 我们声明了一个变量i 那么系统在内存中给我们 开辟了一块 内存地址为0026f9d0的内存地址
,并且把30存贮在内存中。
紧接着我们又声明了一个指针变量 p 系统同样会在内存中给我们开辟一块内存 地址为0026f9c4
,并且把0026f9d0这个地址给我们存贮进去了。(一级指针)
最后我们又声明了一个二级指针变量 pp 系统同样会在内存中给我们开辟一块内存 地址为0026f9b3
,并且把0026f9c4这个地址给我们存贮进去了。(二级指针)
2 指针的简单使用。
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
/**
模拟尝试改变值
method1
**/
void change1(int i) {
i = 20; // 这里根本就不能改变 i的值 这里的i和main方法中的i没有任何关联,这里是新申请了一个变量i
}
/**
模拟尝试改变值
method2
**/
void change2(int* p) {
int i = 20;
p = &i;//& 表示取地址 // 这里根本就不能改变 p的值 这里的p和main方法中的p没有任何关联,这里是新申请了一个指针变量p
printf("method 2 pointer: %p\n", p);//%p占位符为指针地址
}
/**
模拟尝试改变值
method3
**/
void change3(int* p) {
*p = 30; //*指针 表示取值。这里就是对p的存贮值获取 // 这里才是对main中的i进行重新复制 首先把i的地址传过来 然后对地址取值并且重新赋值
printf("method 3 pointer %p\n", p);
}
int main()
{
int i = 89;
int* p = &i;
change1(i);
printf("original pointer: %p\n", p);
printf("original i= %d\n",i);
printf("-------------------------\n");
change2(p);
printf("change2 i= %d\n", i);
printf("-------------------------\n");
change3(p);
printf("change3 i= %d\n", i);
printf("-------------------------\n");
int** pp = &p;
printf("pp=%p\n", pp);
getchar();
return 0;
}
运行如下
同样 我们debug也能看到到内存的
执行完方法1以后
可以看到i的值还是89
我们继续往下执行方法2
同样第二个方法执行完后还是89
最后执行方法三
p地址上的值也就是i 已经变为30了。
最后我们看看我们的二级指针
这里就那个看到我们二级指针里面存的是一个一级指针
而一级指针当中我们存了一个变量。
上面就是 对指针的初步解析。