• C语言基础丨运算符之指针运算符*和取地址运算符&(九)


    C语言的指针

    指针就是地址,指针也是C语言的一种数据类型。

    用指针类型定义的变量称作指针变量,指针变量储存的不是普通数据而是一个地址,一个变量的地址称为该变量的指针。

    指针变量定义的一般形式为:类型标识符 * 变量名

    星号是指针类型的标志。

    C语言指针变量的使用需要以下两个运算符:

    &:取地址运算符,它返回运算对象的内存地址。

    * :指针运算符,也称为“间接引用操作符”,它返回指针指的变量的值。

    1.取地址运算符 &

    & 是一元运算符,返回操作数的内存地址。如果操作数 x 的类型为 T,则表达式 &x 的类型是 T 类型指针(指向 T 的指针)。

    取址运算符的操作数必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(例如左值),而不可以用于位字段,以及那些还未被存储类修饰符 register 声明的内容。

    当需要初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址:

    float x, *ptr; ptr = &x;          // 合法:使得指针ptr指向x ptr = &(x+1);      // 错误: (x+1) 不是一个左值

    2.指针运算符*

    相反地,当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符 *(indirection operator),有时候这会被称为解引用运算符(dereferencing operator)。它的操作数必须是指针类型。如果 ptr 是指针,那么 *ptr 就是 ptr 所指向的对象或函数。如果 ptr 是一个对象指针,那么 *ptr 就是一个左值,可以把它(即 *ptr)当作赋值运算符左边的操作数:

    float x,*ptr=&x; *ptr=1.7;// 将1.7赋值给变量x ++(*ptr);// 并将变量x的值加1

    在这个示例最后的语句中,ptr 的值保持不变,但 x 的值变成 2.7。

    如果指针操作数的值不是某个对象或函数的地址,则间接运算符*的操作结果无法确定。

    像其他一元操作数一样,运算符 & 和 * 具有很高的优先级。操作数的组合方式是从右到左。因此,表达式 ++(*ptr)中的括号是没有必要的。

    运算符 & 和 * 是互补的:如果 x 是一个表达式,用于指定一个对象或一个函数,那么表达式 *&x 就等于 x。相反地,在形如 &*ptr 的表达式中,这些运算符会互相抵消,表达式的类型与值等效于 ptr。然而,不管 ptr 是不是左值,&*ptr 都一定不会是左值。

    运算符*在C语言中,有两种作用:

    1 用作乘法,为双目运算符,形式为a*b, 就是计算数学中的a乘以b。

    2 用作取值运算,为单目运算符,根据后续操作数(必须为指针)类型,取其指向的值。

    如果你正在学习编程遇到瓶颈,感到迷茫,困惑,值得加入我的【C语言C++学习企鹅圈子
    学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!

    注意:指针运算符和指针说明符

    外形上一样,都是 * 号,但一个用在语句里,一个用在声明里。

    例如:

    int *p; 声明 p 是指针,它可用来指向一个 整形变量。

    int (*pf)(); 声明pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。

    int *ap(int x,int y){...} 声明 函数 ap, 有2个形参,函数调用会返回 一个指针,用来指向一个 整形变量。

    指针运算符,也在其操作数的左边,该操作数是一地址,用*可取得该地址处存储的变量的值,可做右值,也可做左值。

    例如:

    int myAge; int *p; //指针说明符

    *(&myAge)=24; // 指针运算符,&myAge 是地址,* 是取那个地址里的值的运算,做左值

    printf("%d",myAge); p=&myAge;

    printf(" %d",*p+1); //指针运算符, 输出 指针指向的变量的值加1,做右值。

    输出 24 25

    今天就分享到这里啦,希望对大家学习有所帮助!

  • 相关阅读:
    面试题:区分List中remove(int index)和remove(Object obj)
    Collection的子接口之一:List 接口
    面试题:ArrayList、LinkedList、Vector三者的异同?
    jdk 5.0 新增的foreach循环(用于遍历集合、数组)
    Iterator迭代器接口(遍历Collection的两种方式之一)
    哈希值
    Collection接口方法
    集合框架的概述
    注解(Annotation)
    System类、Math类、BigInteger与BigDecimal的使用
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14374370.html
Copyright © 2020-2023  润新知