int *p = &aCPU 读写数据必须要知道数据在内存中的地址,普通变量和指针变量都是地址的助记符,虽然通过 p 和 a 获取到的数据一样,但它们的运行过程稍有不同:a 只需要一次运算就能够取得数据,而 p 要经过两次运算,多了一层“间接”。也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高。
关于 * 和 & 的谜题
假设有一个 int 类型的变量 a,pa 是指向它的指针,那么&a和&pa分别是什么意思呢?
&a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),(&a)表示取这个地址上的数据(等价于 pa),绕来绕去,又回到了原点,&a仍然等价于 a。
&pa可以理解为&(pa),pa表示取得 pa 指向的数据(等价于 a),&(pa)表示数据的地址(等价于 &a),所以&pa等价于 pa。
对星号*的总结
在我们目前所学到的语法中,星号*主要有三种用途:
表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
表示获取指针指向的数据,是一种间接操作,例如int a, b, p = &a; p = 100; b = *p;。
int *ptr = NULL
和int *ptr = 0
都是表示初始化指针为空指针。int *p = &a
CPU 读写数据必须要知道数据在内存中的地址,普通变量和指针变量都是地址的助记符,虽然通过 p 和 a 获取到的数据一样,但它们的运行过程稍有不同:a 只需要一次运算就能够取得数据,而 p 要经过两次运算,多了一层“间接”。也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高。关于 * 和 & 的谜题
假设有一个 int 类型的变量 a,pa 是指向它的指针,那么&a和&pa分别是什么意思呢? &a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),(&a)表示取这个地址上的数据(等价于 pa),绕来绕去,又回到了原点,&a仍然等价于 a。 &pa可以理解为&(pa),pa表示取得 pa 指向的数据(等价于 a),&(pa)表示数据的地址(等价于 &a),所以&pa等价于 pa。
对星号*的总结
在我们目前所学到的语法中,星号*主要有三种用途: