• C复习-指针


    参考: 里科《C和指针》


    指针存储的是一个地址,实际就是一个值。

    如果像下面一样对未初始化的指针进行赋值,如果a的初始值是非法地址,那么会报错。UNIX会提示段错误segmentation violation,或内存错误memory fault,指程序试图访问一个未分配给程序的内存位置;如果windows的话一般是保护性异常General Protection Exception。如果a的初始值是合法地址,那可能更麻烦了,因此在对指针进行间接访问之前,必须确保已经初始化(或者是NULL)。

    int *a;
    ...
    *a = 12;
    
    • 1
    • 2
    • 3

    向函数传递指针前也要先检查是否为NULL。因为按标准,在函数里不检查,检查交给用户(创建时检查)。

    指针的指针

    int a = 12;
    int *b = &a;
    int **c = &b;
    
    • 1
    • 2
    • 3
    char ch = 'a';
    char *cp = &ch;
    
    • 1
    • 2
    表达式说明重要性
    *cp + 1‘b’*的优先级高于+
    *(cp + 1)这是非法的,ch后面的值未知
    ++cp非法,是找ch后面的值
    *++cp右值是ch后面的值,左值是ch后面那个位置
    *cp++右值是ch的值,左值是ch的地址。但是cp移到下一个位置了。后缀++的优先级高于*,这里是1)++产生了cp的拷贝;2)++操作cp;3)在cp的拷贝上实现间接访问
    ++*cp‘b’++和*都是从右向左结合的,所以先间接访问。不能作为左值
    (*cp)++‘a’因为先间接访问,所以计算的值就是’a’,随后ch的值+1变’b’
    ++*++cp先后移指针,然后取值,再+1很少见
    ++*cp++因为后缀++的优先级高,所以先移动cp,然后间接访问到ch,+1后ch=’b’,此时cp还是指向ch后一个位置很少见

    实例

    size_t
    strlen(char* string) {
        int length = 0;
        /*
        * 如果string=null会报错,因为++自动移动,但是访问冲突
        * 这里不检查是否为null,是希望用户检查
        */
        while ( *string++ != '\0')
        {
            length += 1;
        }
        return length;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    指针算术加减

    指针+1是移动到下一个位置,而非下一个字节。比如int要4个字节,那么int *ptr, ptr+1时实际移动了4个字节,并不是在指针内部移动。

    指针减指针

    只有在数组内有意义,得到的结果是ptrdiff_t类型,是一种有符号整数类型。这个结果除以数组类型的长度(比如float是4)就是坐标差。如果两个指针指向的元素不在同一数组,这个结果就是未定义的。大部分编译器也不会检查是不是在一个数组。

    指针的关系运算

    同样在数组中有意义,指< ≤ > ≥。虽然标准允许指向数组元素的指针,与数组最后一个元素后面的内存位置的指针比较,但是不允许它与指向index=0前一个位置的指针比较。不能保证移植性。

  • 相关阅读:
    linux驱动开发(1)前言
    【docker实战】如何上传镜像到自己的私有仓库
    linux下profile、bashrc区别和PATH、LIBRARY_PATH、LD_LIBRARY_PATH区别
    最优装载问题--贪心算法
    腾讯JAVA后端秋招面试总结
    JavaEE初阶-计算机是如何工作的
    Nginx实现本地http转https请求
    算法与数据结构(2)--- 绪论(下)
    排序,瀑布流和分页,子查询
    入门力扣自学笔记198 C++ (题目编号:1704)
  • 原文地址:https://blog.csdn.net/pxy7896/article/details/134039193