• C语言基础知识 -- 指针


    1.指针是什么

    在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内存单元。

    指针是一个变量,内存存放单元的地址(编号)

    一个单元为1个字节

    总结:

    • 指针是用来存放地址的,地址是唯一标示一块地址空间的
    • 指针的大小在32位平台是4个字节,在64位平台是8个字节
    • 1个字节8位
    1. #include
    2. int main()
    3. {
    4. int a = 10;
    5. int *p = &a;
    6. return 0;
    7. }

    2.指针和指针类型

    1. #include
    2. int main()
    3. {
    4. printf("%d\n",sizeof(char*));
    5. printf("%d\n",sizeof(short*));
    6. printf("%d\n",sizeof(int*));
    7. printf("%d\n",sizeof(double*));
    8. return 0;
    9. }
    10. // 指针类型,在64位平台,输出结果均为8

    指针类型 决定了指针进行解引用操作的时候,能够访问空间的大小

    指针类型决定了:指针向前或向后走一步有多大距离

    1. int *p; //*p能够访问4个字节
    2. char *p; //*p能够访问1个字节
    3. double *p; //*p能够访问8个字节
    4. int *p+1; //*p跳过4个字节
    5. char *p+1; //*p跳过1个字节
    6. double *p+1; //*p跳过8个字节

     通过指针把数组中每个元素都变成1(重要,值得参考)

    1. #include
    2. int main()
    3. {
    4. int arr[10] = {0};
    5. int *p = arr; // 数组名 -- 首元素的地址
    6. int i = 0;
    7. for(i = 0;i<10;i++){
    8. *(p+i) = 1; // 把数组中的每个元素换成1
    9. }
    10. return 0;
    11. }

    总结:指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节),比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问4个字节。 

    3.野指针

    1. int a; // 局部变量不初始化,默认是随机值
    2. int *p; // 局部的指针变量,就被初始化随机值

    指针变量未初始化、指针越界访问、指针指向的空间被释放(取局部变量的地址),都会产生野指针 

    3.1 如何规避野指针

    1.指针初始化

    1. #include
    2. int main()
    3. {
    4. int b = 0;
    5. int a = 10;
    6. int *p = &a; // 初始化
    7. int *p = NULL; // NULL -- 用来初始化指针,给指针赋值
    8. return 0;
    9. }

    2.小心指针越界

    3.指针指向空间释放,即使其置NULL

    4.指针使用之前检查有效性

    4.指针运算

    • 指针+-整数
    • 指针-指针

    得到的为中间元素的个数

    • 指针的关系运算

    指针可以比较大小

    5.指针和数组

    数组名为首元素的地址

    1. #include
    2. int main()
    3. {
    4. int arr[10] = {0};
    5. printf("%p\n", arr);
    6. printf("%p\n", &arr[0]);
    7. printf("%p\n", &arr);
    8. return 0;
    9. }
    10. // 1. &arr --&数组名,数组名不是首元素的地址,数组名表示整个数组
    11. // &数组名,取出来的是整个数组的地址
    12. // 2. sizeof(arr) -- sizeof(数组名)--数组名表示的整个数组
    13. // --sizeof(数组名)计算的是整个数组的大小

    6.二级指针

    1. #include
    2. int main()
    3. {
    4. int a = 10;
    5. int *pa = &a;
    6. int **ppa = &pa; // 二级指针
    7. return 0;
    8. }

    7.指针数组

    存放指针的数组,本质为一个数组

    1. #include
    2. int main()
    3. {
    4. int a = 10;
    5. int b = 20;
    6. int c = 30;
    7. int *arr[3] = {&a, &b, &c};
    8. int i = 0;
    9. for (i = 0; i < 3; i++)
    10. {
    11. printf("%d\n", *(arr[i]));
    12. }
    13. return 0;
    14. }
    15. // 整型数组 --存放整型
    16. // 字符数组 --存放字符
    17. // 指针数组 --存放指针
  • 相关阅读:
    tomcat 部署web项目
    电脑换cpu要重装系统吗
    PyTorch实现注意力机制及使用方法汇总,附30篇attention论文
    NICE-SLAM——论文简析
    python08_函数练习
    Feign常用的注解、Http请求调用
    java基于springboot的辅导员学生综合成绩考评管理系统ssm
    GitHub学习(三)
    设置Oracle数据库默认为spfle启动,并且设置数据库SGA大小和PGA大小
    C++ struct 笔记(超级详细)
  • 原文地址:https://blog.csdn.net/qq_45355603/article/details/126143754