一、变量存储
看下列一个简单的代码,变量a被赋值于6,它是如何在内存中是如何对应的呢?我们先打印出a变量的地址。
int main(){
int a = 6;
printf("%d\n",&a); //输出0x61FE1C
}
为了方面观众老爷观看,我画了个内存结构图,一目了然。
从这张图中,你不难看出,只有6这个值在内存中真正的占用了内存空间,而这个地址值,他并不占用内存空间,他只是用来标识6这个值在内存中的位置。
二、一级指针
我们来修改一下代码。创建了一个指向整形的指针p,指向a的地址,打印出指针的地址。
int main(){
int a = 6;
printf("%d\n",&a);
// int* p = &a; 两种写法是一样的
int *p = &a;
printf("%d\n",&p); // 输出0x61FE10
}
看内存结构图。欸,我们仔细观察,p指针的内容竟然存着变量a的地址,这样我们就可以通过*间接访问地址修饰符来操作0x61FE1C地址的值 也就是6
举一反三,我们要是知道一个变量的地址,我们直接去操作地址,看代码。
//地址需要强转为指针,再通过*符号访问地址,输出6
printf("%d\n",*((int *)0x61FE1C));
三、二级指针
二级指针其实也类似于一级指针。不多bibi,我们上代码。
int main(){
int a = 6;
int *p = &a;
int **ptr = &p;
printf("%d\n",&ptr); //输出0x61FE08
}
我们看内存结构图,看看是不是你想的那样┑( ̄Д  ̄)┍
你可以看到ptr指针的内容存放的是指针p的地址,
通过访问ptr指针得到的是p指针,
访问p指针得到的是a变量。
是不是有种无限套娃的感觉( ̄▽ ̄)"。
如果你理解了这种关系,多少级指针都是一样的哦。
要想在函数调用中,改变指针的指向,二级指针很常用。篇幅有限,大家可自行尝试。
作者水平有限,文章中若存在问题还请指出,最后,如果文章对你有帮助,不妨点赞对博主支持一下把。