假设我们现在定义有三个变量。
#include<stdio.h> 定义的时候是这样定义的,要与使用的时候区分
int main(){
int a=10;//定义
int *p=&a;//定义
int **q=&p;//定义
}
int a=10; 表示 a赋值为10 a的类型是int类型
a的地址用&a表示
int *p=&a; 表示 p赋值为(a的地址) p的类型为int *
int **q=&p; 表示 q赋值为(p的地址) q的类型为int **
因此:把类型去掉(把迷惑你的东西去掉)
a=10
p=&a => *p就是 取p的内容 p呢是a的地址,替换一下 得出 取(a的地址)的内容,那就是a的值
q=&p => *q就是 取q的内容 q呢是p的地址 替换一下 得出 取(p的地址)的内容,那就是p的值
p的值是什么呢 p=&a 因此 再替换一下 得出 p的值是a的地址
对于变量a来说,有两个操作。 a,&a
操作一:输出a的值。
printf("a=%d",a);
操作二:输出a的地址。
printf("a的地址=%p",&a);
对于指针p来说,有三个操作 p,&p,*p
操作一:输出*p,就是a的值。
printf("*p=%d",*p);//p的*操作,是取p里面的值,就是a的值
printf("a=%d",a);
操作二:输出p,就是a的地址
printf("p=%p",p);//因为p=&a所以直接输出p就是a的地址
//也可以看出*p是对a的地址取*操作,是a的值
printf("&a=%p",&a);
操作三:输出&p,就是p的地址
printf("&p=%p",&p);
对于指针的指针q来说,有四个操作 q &q *q **q
操作一:输出q的,就是p的地址
printf("q=%p",q);
操作二:输出&q,就是q的自己的地址
printf("&q=%p",&q);
操作三:输出*q ,就是a的地址
printf("*q=%p",*q);
操作四:输出 **q,就是a的值
printf("**q=%d",**q);