首页 > 系统相关 >Linux & 标准C语言学习 <DAY11>

Linux & 标准C语言学习 <DAY11>

时间:2023-03-13 09:11:06浏览次数:53  
标签:const 变量 指向 int C语言 学习 内存 Linux 指针

一、指针     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 = &num;             堆内存:                 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 == *指针变量 == 数据

标签:const,变量,指向,int,C语言,学习,内存,Linux,指针
From: https://www.cnblogs.com/phony/p/17210166.html

相关文章

  • java学习日记20230312-构造方法
    构造方法/构造器基本语法[修饰符]方法名(形参列表){方法体;}构造器的修饰符可以是默认;构造器没有返回值;方法名和类名字必须一样;参数列表和成员方法一样的规则;构......
  • vscode 配置 linux C++ 开发环境 和 终端配置 oh-my-zsh
    1.配置linuxC++开发环境vscode安装C/C++;CodeRunner插件。#安装gdbsudoapt-getupdatesudoapt-getinstallgdb点运行按钮就可以调试和运行代码了......
  • 在 Linux 中如何查找父进程 PPID?
    导读内核创建的进程称为“父进程”。从父进程派生或产生的进程称为“子进程”。父进程可能由多个子进程组成,每个子进程都具有唯一的PID(进程ID)但共享相同的PPID。......
  • 个人工作流程学习收获
    一、项目开发流程对于各个整个项目流程进行规划了解,明了自己的处理需求,知道技术点的用处,只需要大概的理解不需要详细的讲解。二、自己开发的模板必须熟练自己负责区域某......
  • 【linux】使用 Xshell 上传本地文件到服务器
    需求:上传本地文件到服务器,常见的作法是通过ssh上传,但是我们有了Xshell后可以简化操作。 操作步骤:1.打开Xshell,连接好自己的服务器2.选择要存储的服务器......
  • Linux提权-权限升级
    Linux提权-权限升级 特权升级是一段旅程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、已安装的应用程序、支持的编程语言、其他用户的密码是影响您......
  • MySQL学习笔记-事务
    事务事务:是一组操作的集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败(当操作中某一步出现......
  • 学习java第三周
    前言:这周过的很充实,因为对之前的内容没有很好理解本周一部分时间消化之前内容,经过三周的学习,对Java开始有了自己的认知,长路漫漫对自己的学习情况并不是很满意.对本周内......
  • Redis Stream Commands 命令学习-1 XADD XRANGE XREVRANGE
    概况ARedisstreamisadatastructurethatactslikeanappend-onlylog.Youcanusestreamstorecordandsimultaneouslysyndicateeventsinrealtime.Exam......
  • 数据结构学习笔记-day3
    Day3一、线性表的定义和特点由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表。N为线性表的长度,当n=0时,称其为空表。  二、线性表的顺序表示和实现    ......