一、指针
    1、什么是指针
        指针是一种特殊的数据类型,使用指针可以定义指针变量,指针变量存储的是整形数据,该数据代表了内存的编号(地址),可以通过这个编号访问到对应的内存
   
    2、为什么要使用指针(使用场景)
        1.函数之间内存是互相独立的,但是有些时候需要函数之间共享变量
            普通传参是单项值传递,而全局变量容易命名冲突
            使用数组还需要额外传递长度
            虽然函数之间内存和命名空间是相互独立的,但是地址空间是同一个,所以使用指针可以解决这个问题
        2.由于函数之间普通变量是单项值传递(拷贝),因此对于一些字节数比较多的变量,值传递的效率很低,如果传递的是地址,只需要4(32位)/8(64位)字节
        3.堆内存无法取名,它不像data、bss、stack这些可以让变量名与对应的内存建立联系,只能使用指针变量记录堆内存的地址从而使用堆内存
    3、如何使用指针
        1.定义:类型名* 变量名_p;
            a.指针变量和普通变量的用法有很大区别,因此建议在取名时以p结尾加以区分
            b.指针变量的类型表示它存储的是什么类型变量的地址,它决定了通过该指针变量能够连续访问的字节数
            c.一个*只能定义一个指针变量
                int *a,b,c  //a是指针变量,b、c是int类型变量
            d.指针变量与普通变量一样,默认初始值是随机的,一般初始化为NULL
       
        2.赋值:变量名_p = 地址;  //必须是有权限且有意义的内存地址
            栈内存:
                p = #
            堆内存:
                p = malloc(4);
        3.解引用:*变量名_p;
            通过该指针变量中存储的内存编号去访问对应的内存,具体连续访问的字节数由该指针类型决定
            注意:该过程可能会产生段错误,根源是该指针变量中存储的是非法内存地址
    4、使用指针需要注意的问题
        1.空指针:值为NULL的指针变量叫做空指针,如果对空指针解引用会产生段错误
            NULL是一种错误标志,如果一个函数的返回值类型是指针类型时,该函数执行出错则可以返回NULL
            NULL可以被判断 if(NULL == 变量名_p) if(!p)
            注意:绝大多系统中NULL就是0,个别系统是1
            如何避免空指针带来的段错误:使用来历不明的指针前进行判断
                a.当函数的返回值是指针类型时,获取后先判断后使用
                b.当函数的参数时指针时,别人可能会传空指针,使用前先判断
        2.野指针:指向不确定的内存空间的指针叫做野指针 int *p;
            对野指针解引用有什么后果
                a.一切正常
                b.段错误
                c.脏数据
            野指针比空指针危害大,因为它无法被判断,并且它的问题可能是隐藏性的短时间内不暴露自己
            所有的野指针都是程序员自己制造的,如何避免产生野指针
                a.定义指针变量时一定要初始化
                b.函数不要返回局部变量(栈内存)的地址
                c.当指针所指向的内存被释放后,指针变量要及时置空
    5、指针的运算
        指针变量中存储的是整数,理论上整形数据可以使用的运算符它都可以使用,但是绝大多数没有意义
        指针 + n -> 指针+指针类型字节数*n 前进了n个元素
        指针 - n -> 指针-指针类型字节数*n 后退了n个元素      
            运算后得到的结果依然是一个临时的指针
        指针1 - 指针2 -> (指针1 - 指针2) / 类型字节数  //必须相同类型的指针才能相减
    6、指针与const
        就近原则:const右边先跟着的是*(内存)还是P(指向)
            const int *p;           保护指针指向的内存不能被修改
            int const *p;           保护指针指向的内存不能被修改
            int* const p;           保护指针的指向不能被修改
            const int* const p;     保护指针的指向、指向的内存不能被修改
            int const * const p;    保护指针的指向、指向的内存不能被修改
       
    7、指针数组与数组指针(使用堆内存时使用)
        1.指针数组:就是由指针组成的数组,它的成员都是类型相同的指针变量
            int *arr[10]={};
       
        2.数组指针:专门指向数组的指针
            int (*arr_p)[10];  //arr_p是一个专门指向类型为int,长度为10的数组的指针
    8、指针与数组名
        数组名是一种特殊的"指针",它与数组在内存中的首地址之间存在映射关系,它没有自己的存储空间,数组名是常量,不能修改它所代表的值
        指针变量有自己的存储空间,它与内存之间是指向关系,如果它存储了数组的首地址,就可以当做数组使用,同时数组名也可以当作指针使用
            int *p = arr;  //存储的是数组的首地址
            p[i] == *(p+i);
            arr[i] == *(arr+i);
    9、二级指针
        指向指针的指针,里面存储的是指针变量的地址
        1.定义:
            类型名** 变量名_pp;
       
        2.赋值
            变量名_p = &指针变量;
        3.解引用
            *变量名_p == 指针变量
            **变量名_p == *指针变量 == 数据

Linux & 标准C语言学习 <DAY11>的更多相关文章

  1. Unix和Linux下C语言学习指南

    转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...

  2. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  3. UNIX/Linux下C语言的学习路线

    一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或 ...

  4. C语言学习008:标准错误

    在上一节中的数据文件中(C语言学习007:重定向标准输入和输出),如果文件中的数据包含非法数据,如何让程序显示一条错误的提示消息呢?就需要用到标准错误 #include <stdio.h> ...

  5. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  6. 实验四 Linux系统C语言开发环境学习

    项目 内容 这个作业属于哪个课程 Linux系统与应用 这个作业的要求在哪里 作业要求链接 学号-姓名 17041428-朱槐健 作业学习目标 1.Linux系统下C语言开发环境搭建 2.学习Linu ...

  7. 【C语言学习】《C Primer Plus》第1章 概览

    学习总结 1.C语言于1972年由贝尔实验室的Dennis Ritchie在与Ken Thompson一起设计UNIX操作系统的时候开发的.的的设计构想来源于Ken Thompson的B语言.Anyw ...

  8. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  9. 郝斌老师C语言学习笔记(一)

    在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...

  10. 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

    原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...

随机推荐

  1. linux用户账户与组账户,文件权限及归属管理

    Linux是一个多用户, 多任务多进程的服务器操作系统 用户角色:超级用户(管理员),普通用户,程序用户 用户账号管理用户账号概述用户:使用者在计算机内部的身份标识 用户账号的常见分类:超级用户: r ...

  2. mybatis纵览

    Mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyBatis 可 ...

  3. canvas 模糊

    让style以50%的效果展示 创建2倍的canvas <!DOCTYPE html> <html> <head> <meta charset="u ...

  4. 「DIARY」PKUSC2021 小结

    另外有一个纯吐槽游记版本的,还没有写完(快写完了,真的) 欢迎各路神仙来吐槽一个菜鸡的考场思路 # Day1 考场小结 总体而言,T1 完全就是送分,做得也挺快的:T2 大概是本场最难的题:然后 T3 ...

  5. 解决通过Eclipse启动Tomcat-Run On Server出现The selection cannot be run on any server

    有时候通过Eclipse启动Tomcat-Run On Server会出现The selection cannot be run on any server的情况如下图: 这是因为没有在eclipse ...

  6. Linux日常指令

    Linux: https://man.linuxde.net/     Linux命令大全  基础指令 终端输入: #shutdown -h now : 立即关机   #ls: 显示路径下所有的文件: ...

  7. 北大2022编译原理实践(C/C++)-sysy 编译器构建

    这是今年新推出的实践方案,由往年的sysy->IR1->IR2->RISC V变成了sysy->Koopa->RISC V,通过增量的方式让整个实践过程更容易上手 所以先 ...

  8. #Python #字符画 #灰度图 使用Python绘制字符画及其原理

    由于最近身体状况不太好所以更新会有点慢,请大家多多包涵.同时也提醒大家注意保重身体! 前提:默认大家已经正确安装了 Python,且正确将Python配置到了系统Path . 目录 1.字符画的概况 ...

  9. Importing Your Own Python Module or Python File into Colab

    Source from : https://medium.com/analytics-vidhya/importing-your-own-python-module-or-python-file-in ...

  10. 接口自动化-requests环境安装(import requests模块引用失败问题)

    命名规范,可以避免低级问题 1. 命名最好是英文字符.下划线.数字三个组成. 2.项目(工程)名称.文件包名.模块名称等都应该是用英文开头,不能纯数字,(下划线开头的一般有特殊含义,不懂的话别乱用) ...