注意看代码块里面的注释
本人小白,希望大佬指正
#include<stdio.h>
int main() {
int a[3] = {1, 2, 3};
int *p;
p = &a[0];
printf("%d\n", *p);//输出通过p存在的地址访问到内存中所存在的数值
printf("%p\n", p);//输出p存的地址,也就是a[0]的地址
printf("%p\n", &p);//输出p指针所在的地址,即p本身的地址
//注意地址的输出是%p
/*顺便说一下 %g是对于浮点数的输出,作用是去掉多余的0,不如对于数值-2.4,如果求绝对值 fabs(-2.4), 得到的结果会是2.400000,那么我们怎么确保是输出为2.4呢,将输出的占位符%d替换为%g就可以了*/
return 0;
}
//注意
对于上面例子
p里面存的是a[0]的地址
那么其实,p + 1 其实就是对地址进行 +1, 也就是 p + 1 = &a[1];
*p就是通过p存在的地址访问到内存中所存在的数值 即*p = a[0];
&p就是指针p自己本身的内存地址
//
printf("%d\n",*(p + 1));//输出a[1]的值
printf("%d\n",*(a[0] + 1))//输出a[1]的值
- p + 1 和 &a[0] + 1这种运算得到的都是a[1]的地址,再取*就会得到a[1]的值
- 类似的p + 2、 &a[0] + 2、 &a[1] + 1都会得到a[2]元素的地址了,就是&a[2];
#include <stdio.h>
int main() {
int a = 4;
int *p;//声明一个指针
p = &a;
int **q;//声明一个指向指针变量的指针变量
q = &p;//q指向的是p的地址
printf("p in %p, q = %p\n", &p, q);//输出都是p的地址
printf("a in %p, p = %p, *q = %p\n", &a, p, *q);//输出a的地址,*q指向的是p本身的地址,*q = *(&p),就是取p中存储的值,也就是p中存着的a的地址
printf("a = %d, *p = %d, **q = %d\n", a, *p, **q);//输出a的值
return 0;
}
写于2021.6.4
有帮助的话,点个赞吧,谢谢