两个关键符号

&: 取内存地址符
*: 取内存值符

指针的操作规律

1.声明的时候是往里放地址 int *p = &num,
2.直接拿的时候就是直接操作地址内的值 *p = 10;

在 C 中操作地址就可以操作值,就跟 java 中两个引用类型拿到引用可以操作内一个对象一样。

1
2
3
变量名    内存地址	   值
a [0x23fa32] 100
*p [0x24aa34] [0x23fa32]

指针存放的是 a 的内存地址,&p则是自己的内存地址 [0x24aa34]

创建一个针指并使用

1
2
3
4
5
6
7
8
void main() {
int num = 100;
//将内存地址给 *p
int *p = #
printf("%x, %x",&num, &p);
*p = 10;
printf("%d", num); //10
}

分析过程:
根据拿到的直址 分别查看 &num,和 &p。&num 的地址以 带符号 4字节查看是100。
查看&p 的地址,以十六进制查看,因为存的是 &num 的地址。并不是实际的值。这就证明了指针变量存的是地址。
当程序再往下走 *p = 10 时,再回头看 &num 的值,已经变红,修改成了10。

传递指针

1
2
3
4
5
6
7
8
9
10
void main() {
int num = 100;
//形参是指针类型,就可以将地址传递过去。
change(&num);
}

//创建一个指针用来接收地址
void change(int *p) {
*p = 20;
}

需要注意的是C当中的方法形参使用的是变量副本机制,也就是说,方法形参也是有个自己的内存地址。