版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
C语言中&运算符和*运算符详解
文章目录
前言
在学习C Primer Plus 数组与指针一章时,对取址运算符& 与间接运算符* 的使用,始终有些迷惑,直到又结合左值与右值进行了一次深入的学习,感觉有些清楚了,写篇文章总结一下。
提示:以下是本篇文章正文内容
一、取址运算符&与间接运算符*
1.取址运算符&
取值运算符& 是用来取得其操作对象的地址。如果操作对象x的类型为T,则表达式&x的类型是T类型指针(指向T类型对象 x的指针)。
取值运算符的操作对象必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(左值),而不可用于位字段,以及哪些还未被存储类修饰符register声明的内容。
当需要初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址:
float x,*ptr; ptr=&x;// 合法,使得指针ptr指向x ptr=&(x+1);// 错误,(x+1)不是一个左值
2.间接运算符*
与取址运算符& 相反,间接运算符* 用于当已经具有一个指针,并希望获取它所引用的对象时,因此也被称为解引用运算符。
它的操作对象必须是指针类型。如果ptr是指针,那么 *ptr就是
ptr所指向的对象或函数。如果ptr是一个对象指针,那么 *ptr就是一个左值,可以把它即( *ptr)当做赋值运算符左边的操作数:
float x,*ptr=&x;*ptr=1.7;// 将1.7赋值给变量x++(*ptr);// 并将变量x的值加1
在最后的语句中,ptr不变,但是变量x的值变为了2.7。
注意:千万不要解引用未初始化的指针!!!
int* ptr;// 未初始化的指针*pt=5;// 严重错误!!!
因为,ptr还未被初始化,其值是一个随机值,所以不知道5将储存在何处,可能不会出什么错,但是也可能擦写数据或代码,或者将导致程序崩溃,切记,创建一个指针时,系统只分配了储存指针本身的内存,并未分配储存数据的内存。在使用指针前,务必先用已分配的地址初始化它,例如使用现有变量的地址初始化,或者使用malloc()函数分配内存。