地址运算符: 指针 &
C 语言中最重要的, 也是最复杂的, 概念之一就是指针, 也是用来存储地址的变量.
一般来说, 当需要改变调用函数中的某个参数数值时, 任何被调用的无返回值 C 函数都需要使用地址来完成这个任务.
一元运算符 & 可以取得变量的存储地址, 如 pooh 是一个变量名, 则 & pooh 就是变量 pooh 的地址, 可以看作变量 pooh 在内存中的存储位置.
int i = 0; /* 声明和初始化 int 变量 i, 值为 0 /
int * ipointer; / 声明 int 类型的指针变量 ipointer /
ipointer = &i; / 指针变量 ipointer 的值为变量 i 的地址 */
2. 间接运算符: *
当后面跟着是一个指针变量或地址时,* 给出存储在地址里的数值, 如:
- int var = 0;
- int * varptr = &var;
- int var2 = *varptr;
*varptr 表示指针 varptr 地址存储里的数值, 那么变量 var2 的值等于变量 var 数值
3. 指针操作
C 提供了 6 种基本的指针操作.
3.1 赋值
可以把一个地址赋给指针. 通常使用数组名或地址运算符 & 来进行地址赋值.
3.2 求值
运算符 * 可取出指针指向地址中存储的数值.
3.3 取指针地址
指针变量同其他变量一样具有地址和数值, 使用运算符 & 可以得到存储指针本身的地址.
3.4 将一个整数加给指针
可以使用 + 运算符来把一个整数加给一个指针, 或者把一个指针加给一个正数. 两种情况下, 这个整数都会和指针所指类型的字节相乘, 然后所得的结果会加到初始地址上.
如果想加的结果超出了初始化所指向的数组的范围, 那么这个结果是不确定的, 除非超出数组最后一个元素的地址能够确保是有效的.
3.5 增加指针的值
可以通过一般的加法或增量运算符来增加一个指针的值. 对指向某数组元素的指针做增量运算, 可以让指针指向该数组的下一个元素. 比如指针变量 ptr 指向数组的第 1 个元素, 进行 ptr++ 操作, 则 ptr 会指向数组的第 2 个元素.
3.6 从指针中减去一个整数
可以使用 - 运算符来从一个指针中减去一个整数. 指针必须是第一个操作数, 或者是一个指向整数的指针. 这个整数都会和指针所指类型的字节数相乘, 然后所得的结果会从初始地址中减掉, 如果相减的结果超出了初始指针所指向的数组的范围, 那么这个结果是不确定的, 除非超出数组最后一个元素的地址能够确保是有效的.
3.7 减小指针的值
指针当然也可以做减量运算. 比如指针变量 ptr 指向数组的第 3 个元素, 进行 ptr-- 操作, 则 ptr 会指向数组的第 2 个元素.
3.8 求差值
可以求出两个指针间的差值. 通常对分别指向同一个数组内的两个元素的指针求差值, 以求出两个元素之间的距离. 比如指针变量 ptr2 指向数组第 3 个元素, 指针变量指向 ptr0 指向数组的第 1 个元素, 则 ptr2 - ptr0 的值是 2, 表示指针所指向对象之间的距离为 2 个 int 数值大小.
3.9 比较
可以使用关系运算符来比较两个指针的值, 前提是两个指针具有相同的类型.
来源: http://www.jianshu.com/p/4356b0517a9f