• C语言:指针运算


    指针加上一个整数的结果是另一个指针。问题是:它指向哪里?

    如果将一个字符指针加1,运算结果产生的指针指向内存中的下一个字符。

    float占据的内存空间不止1个字节,如果将一个指向float的指针加1,将会发生什么?

    它会不会指向该float值内部的某个字节呢?

    幸运的是,答案是否定的。当一个指针和一个整数量执行算法运算时,整数在执行加法运算之前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向型的大小,“调整”就是把整数值和“合适的大小”相乘。例如:某台机器上,float占4个字节。在运算float型指针加3的表达式时,这个3将根据float类型的大小(此例中为4)进行调整(相乘)。这样实际加到指针上的整数值为12。

    把3与指针相加使指针的值增加3个float的大小,而不是3个字节。

    指针运算分为算术运算和关系运算。

    算术运算只限于两个形式。

    第1种形式是:

    指针 ± 整数

    标准定义这种形式只能用于指向数组中某个元素的指针。

    这类表达式的结果类型也是指针。

    数组中的元素存储于连续的内存位置中,后面元素的地址大于前面元素的地址。,因此,对一个指针加1使它指向数组中下一个元素,加5使它向右移动5个元素的位置,以此类推。把一个指针减去3使它向左移动3个元素的位置。

    要注意的是,如果进行完加法或者减法运算后,指针指向的位置不在数组的范围内,则发生了数组越界。对这个指针执行间接访问,即解引用操作可能会失败。

    第2种形式是:

    指针 - 指针

    只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。

    两个指针相减的结果的类型是ptrdiff_t,它是一种有符号的整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。

    如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。

     

    关系运算

    对指针执行关系运算也是有限制的。用下列关系操作符对两个指针值进行比较是有可能的:

    <   <=    >     >=

    不过前提是它们都指向同一个数组中的元素。

    当然,也可以在两个任意的指针间执行相等或者不相等测试,因为这类比较的结果和编译器选择在何处存储数据并无关系-------指针要么指向同一个地址,要么指向不同的地址。

     

    参考《C和指针》一书。

  • 相关阅读:
    转载: ubuntu13.04下载android4.0.1源码过程
    Android横竖屏切换总结
    java.lang.reflection打印一个类的全部信息
    js实现ctrl+v上传图片
    阿里云oss,简单上传
    FastDFS搭建
    nginx配置反向代理和负载均衡
    nginx配置虚拟机
    linux下安装nginx
    linux安装jdk
  • 原文地址:https://www.cnblogs.com/justloveyou/p/2726193.html
Copyright © 2020-2023  润新知