你可以认为,编译器会自动维护一个映射,将我们程序中的变量名转换为变量所对应的地址,然后再对这个地址去进行读写。
也就是有这样一个映射表存在,将变量名自动转化为地址:
a | 0x7ffcad3b8f3c
c | 0x7ffcad3b8f2c
h | 0x7ffcad3b8f4c
....
说的好!
可是我还是不知道指针存在的必要性,那么问题来了,看下面代码:
int func(...) {
...
};
int main() {
int a;
func(...);
};
假设我有一个需求:
要求在func 函数里要能够修改 main 函数里的变量 a,这下咋整,在 main 函数里可以直接通过变量名去读写 a 所在内存。
但是在 func 函数里是看不见a 的呀。
你说可以通过&取地址符号,将 a 的地址传递进去:
int func(int address) {
....
};
int main() {
int a;
func(&a);
};
这样在func 里就能获取到 a 的地址,进行读写了。
理论上这是完全没有问题的,但是问题在于:
编译器该如何区分一个 int 里你存的到底是 int 类型的值,还是另外一个变量的地址(即指针)。
这如果完全靠我们编程人员去人脑**了,会引入复杂性,并且无法通过编译器检测一些语法错误。
而通过int * 去定义一个指针变量,会非常明确:这就是另外一个 int 型变量的地址。
|