& : 取内存地址符 * : 取内存值符
1.声明的时候是往里放地址 int *p = &num,
2.直接拿的时候就是直接操作地址内的值 *p = 10;
在 C 中操作地址就可以操作值,就跟 java 中两个引用类型拿到引用可以操作内一个对象一样。
变量名 内存地址 值
a [0x23fa32] 100
*p [0x24aa34] [0x23fa32]
指针存放的是 a 的内存地址,&p则是自己的内存地址 [0x24aa34]
void main() {
int num = 100;
int *p = # //将内存地址给 *p
printf("%x, %x",&num, &p);
*p = 10;
printf("%d", num); //10
}
分析过程: 根据拿到的直址 分别查看 &num,和 &p。&num 的地址以 带符号 4字节查看是100。 查看&p 的地址,以十六进制查看,因为存的是 &num 的地址。并不是实际的值。这就证明了指针变量存的是地址。 当程序再往下走 *p = 10 时,再回头看 &num 的值,已经变红,修改成了10。
void main() {
int num = 100;
change(&num); //形参是指针类型,就可以将地址传递过去。
}
void change(int *p) { //创建一个指针用来接收地址
*p = 20;
}
需要注意的是C当中的方法形参使用的是变量副本机制,也就是说,方法形参也是有个自己的内存地址。