#include <stdio.h>
int main(void) {
int a = 10;
int b = 11;
int *p = &a;
// 这里其实是 p = (a 所在的地址),而 &a == (a 所在的地址)
// 即把 &a 的值赋给 p,一个指针(也可以叫做“地址变量”)
// 地址标量也是变量,但是为了和普通的变量做区分,所以使用 * 来标记
// a 是一个变量,但 %p 用于输出地址
printf("a = %d(%%d)\n", a);
printf("a = %x(%%x)\n", a); // 小写的 16进制
printf("a = %X(%%X)\n", a); // 大写的 16进制
printf("a = %#x(%%#x)\n", a); // 带'0x'的小写的 16进制
printf("a = %#X(%%#X)\n", a); // 带'0X'的大写的 16进制
printf("b = %p(%%p)\n", b);
// 在这里 %p 起到了一个将输出的字符由10进制转换为16进制的作用
// & 的功能就是查找地址
printf("a = %p(%%p)\n", &a);
// 而 * 有两个功能,在定义时,代表定义为指针;
// 在其他位置,则代表解引用,即 *p 此时代表指针的地址所在的位置所储存的东西
// 而 p 才是地址的位置
printf("*p = %d(%%d)\n", *p);
printf("*p = %d(%%d)\n", p);
printf("*p = %p(%%p)\n", *p);
printf("*p = %p(%%p)\n", p);
int c[2]; // 普通的数组
int *d; // 普通的指针
int *u[2]; // u[2] 是一个指针数组
// 是一个数组,元素是指针,即“存放指针的数组”
int (*v)[2]; // v 是一个数组指针
// 是一个指针,指向一个数组,即“指向数组的指针”
// 两者不同的原因是:[] 的优先级高于 *
int *w[3];
printf("sizeof(c) = %zu\n", sizeof(c));
printf("sizeof(d) = %zu\n", sizeof(d));
printf("sizeof(u) = %zu\n", sizeof(u));
printf("sizeof(w) = %zu\n", sizeof(w));
printf("sizeof(int *) = %zu\n", sizeof(int *));
printf("sizeof(v) = %zu\n", sizeof(v));
printf("sizeof(*v) = %zu\n", sizeof(*v));
}
a = 10(%d)
a = a(%x)
a = A(%X)
a = 0xa(%#x)
a = 0XA(%#X)
b = 0xb(%p)
a = 0x7ffd585b55b0(%p)
*p = 10(%d)
*p = 1482380720(%d)
*p = 0xa(%p)
*p = 0x7ffd585b55b0(%p)
sizeof(c) = 8
sizeof(d) = 8
sizeof(u) = 16
sizeof(w) = 24
sizeof(int *) = 8
sizeof(v) = 8
sizeof(*v) = 8