C 运算符 & 和 *
取地址运算符:&
- 取值运算符的操作对象必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(左值),而不可用于位字段,以及那些还未被存储类修饰符register声明的内容。
- &a 的运算结果是一个指针:
- 指针的类型是 a 的类型加个*。
- 指针所指向的类型就是 a 的类型。
- 指针所指向的地址就是 a 的地址。
间接运算符:*
- *p 的运算结果是 p 所指向的东西, 这个东西有这些特点:
- 它的类型是 p 指向的类型。
- 它所占用的地址是 p 所指向的地址。
- 千万不要解引用未初始化的指针
示例:
int a = 12;
int b;
int *p;
int **ptr;
p = &a;
- &a 的结果是一个指针。
- 指针的类型是 int*。
- 指针所指向的类型是int。
- 指针所指向的地址是 a 的地址。
*p = 24;
- *p 的结果 p 所指向的东西。
- 它的类型是 int。
- 它所占用的地址是 p 所指向的地址。
- *p 就是变量 a。
ptr = &p;
- &p 的结果是个指针。
- 该指针的类型是 p 的类型加个*,在这里是 int **。
- 该指针所指向的类型是 p 的类型,这里是 int*。
- 该指针所指向的地址就是指针 p 自己的地址。
*ptr = &b;
- *ptr 是个指针,
- &b 的结果也是个指针,
- 这两个指针的类型和所指向的类型是一样的,所以用 &b 来给 *ptr 赋值是毫无问题的。
**ptr = 34;
- *ptr 的结果是 ptr 所指向的东西,在这里是一个指针,对这个指针再做一次 * 运算,结果是一个 int 类型的变量。
参考文档:《让你不再害怕指针》
参考链接:C语言中&运算符和*运算符详解
文章评论