C复习-指针

参考: 里科《C和指针》


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

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

c 复制代码
int *a;
...
*a = 12;

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

指针的指针

c 复制代码
int a = 12;
int *b = &a;
int **c = &b;
c 复制代码
char ch = 'a';
char *cp = &ch;
表达式 值 说明 重要性
*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后一个位置 很少见

实例

c 复制代码
size_t
strlen(char* string) {
    int length = 0;
    /*
    * 如果string=null会报错,因为++自动移动,但是访问冲突
    * 这里不检查是否为null,是希望用户检查
    */
    while ( *string++ != '\0')
    {
        length += 1;
    }
    return length;
}

指针算术加减

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

指针减指针

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

指针的关系运算

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

相关推荐
tachibana28 小时前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者8 小时前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言
爱读书的小胖9 小时前
LeetCode 88. 合并两个有序数组 C 解题分析
c语言·数据结构·算法
唐钰小宝B9 小时前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
inrichtt9 小时前
第七课时:STM32时钟系统揭秘:从零理解时钟树
c语言·数据结构·stm32·单片机·嵌入式硬件
知识分享小能手9 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>9 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
金融小师妹9 小时前
多因子时间序列分析:美元与美债收益率变化对黄金价格+1.6%的影响
c语言·人工智能·git·决策树·pyqt
张张123y10 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃10 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过