为了账号安全,请及时绑定邮箱和手机立即绑定

Linux C语言指针与内存

难度初级
时长 2小时 5分
学习人数
综合评分9.60
263人评价 查看评价
9.9 内容实用
9.5 简洁易懂
9.4 逻辑清晰
  • 20161011 C语言指针和内存4-1 数据表示方法 内存:一个字节8个2进制 32位操作系统(32个地址总线,2的32次幂 2的30次方1024的3次方,就是1G)做多使用4G内存 64位操作系统(2的30次方 =G,2的40次方=T)0xffffffffffffffff - 0x0 内存的管理由操作系统管理,给内存编号,给内存进行规划 1)0x7fffffffffffffff - 0x0为用户使用的内存。 2)其他~0xffffffffffffffff为操作系统内核使用) 例子 p pa 0xffffffffffffddfc//pa里保存的内容(内容的内存地址) p &pa 0xffffffffffffde08// 指针 pa的内存地址 指针8个字节 本质上保存的是内存的地址: 变量:a=第五个柜子第二个抽屉 指针 b:第一个柜子第一个抽屉 内容 :第五个柜子第二个抽屉) 系统内核 栈 (高地址段 先进后出 记录程序已经执行的信息,P &a ,"& '取地址'运算符 " &a表示显示变 量a的内存地址空间,) 自由可分配内存 堆() 数据段(全局变量,常量,静态变量) 代码段(低地址段 编译后的程序的机器码保存位置) C语言不允许直接操作代码段 为static变量也就是静态变量,在程序运行过程中被声明后就会一直保存在内存里,所以只能声明一次,第二次再访问那个函数时,给静态变量声明同时赋值的语句就不再执行了,而静态变量的值始终保存在内存里,也就是上次改变以后的值。 没有static修饰的函数中的变量,只在函数被执行时占用内存,函数执行完毕后就被销毁,数据也就不存在了,所以每次都要声明,值也就不会变。
    查看全部
  • 1.GCC会对内存变量分配进行优化:同一种变量类型会放到一块儿!<br> 2.静态变量、常量、全局变量存于内存的数据段(数据段位置高于代码段)。 3.64位计算机中:地址都是用64bit表示的,所以指针(存储地址)占64bit,即8字节。 注意图中:&pa -> &pb的确是增加了8个字节(16进制中满16进1); 同理:从de18 -> de20也是增加了8个字节。 4.栈区域(最接近系统控制的内存空间)保存的是函数的运行状态:函数执行到哪一个命令?每一个变量保存的什么值?等等 5.在代码段和数据段(区),内存是从低地址向高地址转移的,即:先声明的函数地址小,后声明的函数地址大;而在栈中,刚好相反。
    查看全部
  • 变量名只是代号 变量的本质是内存 在标准的C语言中,不允许直接对内存地址进行操作,只能是对操作系统已经分配给的内存空间进行操作。(防止用户自己操作内存地址时侵吞系统内存或者其他程序的内存) p 指针指向的变量地址 *p 指针指向的变量值 &p 指针自己所在的地址 既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。 函数调用信息保存在栈(stack)中。 int *pa=&a指将a的地址传给pa。因此p pa看到的是a的地址(&a)。 而p &pa才能看到pa本身的地址。
    查看全部
  • Array数组其实是一种指针常量,而p则是一种指针变量(数组和指针有一定的通用性,又有一定的差别,指针可以表达数组,而数组不可以表达指针)
    查看全部
    6 采集 收起 来源:指针运算

    2016-07-28

  • 1.编译命令:gcc -g main.c -o main.out; 2.调试命令:gdb ./main.out; 3.调试器:(gdb)list:列出源代码;(gdb)break line-number:在指定行数打断点;(gdb)start:开启单步调试; (gdb)p a:打印a变量在内存中的情况;(gdb)n:执行到下一句;(gdb)s:进入函数内部;(gdb)bt:查看函数堆栈; (gdb)f 1:切换到编号为1的函数中;(gdb)q:退出调试;
    查看全部
    5 采集 收起 来源:gdb工具的使用

    2015-06-29

  • gdb 是gcc自带的一种调试工具 gdb -help查看gdb用法 gcc -g +源代码文件 的文件才可以调试 调试的文件 必需要能找到源文件 gdb +文件名 表示调试该文件 l(list)可以列出当前调试文件的源代码 按回车表示继续执行刚才的命令 break 12 打断点在12行 start 查看默认断点 p +变量名 可以查看该变量当前的值 n表示执行当前行数 然后跳到下一行(并没有执行) s进入函数里面 bt 查看函数堆栈() f +函数编号 表示切换函数栈 q 表示退出调试
    查看全部
    6 采集 收起 来源:gdb工具的使用

    2017-12-07

  • 静态变量 static关键字。函数调用结束后,静态变量的值不消失。对一个C文件里的全局变量和函数加入static的申明 可以防止被其他C文件误调用,即限定作用域只是当前文件,其他文件中即使有同名变量和函数也不影响。
    查看全部
  • 若“p”是一个地址,则“*p”是到这个地址去取里面的值,“(*p)”把表示为一个整体,“(*p)(数据)”若p为代码段,则调用这个函数,传参数"数据"进去。

    若地址指向的是栈和堆,操作系统会把栈或者堆的具体数据取出来,若地址指向的不是一个栈或者堆,而是代码段的话,操作系统会认为是指向某一个函数


    查看全部
  • C语言在内存中数据的存储位置 char a[] = “linux” 占6个字节,a存储的是首地址,“linux”可以在栈,也可以在堆中 char *p = “linux” 占10个字节,p指针变量占4字节,里面保存的是后面字符串的地址,“linux”占6个字节,存储在代码段。 但字符串要更加灵活: linux栈中: char a[] = “linux” char *p = a; 在代码段: char *p = “linux” 在数据段: 全局的char a[] = “linux” void main() { char *p = a; } 在堆中: 就使用malloc
    查看全部
  • int (*pquadrate)(int a) = &quadrate;是啥意思? 这是将pquadrate声明为函数指针,它指向的是有一个int型参数,返回值为int的函数。这语句同时将pquadrate初始化为quadrate的地址(显然quadrate应该是个函数名)。 一步一步讲这个声明: 这语句声明的是pquadrate变量,前面有个*,而且是用小括号和变量名括起来的(*pquadrate),表明这个变量名优先和*结合。声明变量时前面有*就代表这个变量是指针,所以pquadrate是个指针。那它指向什么呢? 接着看,后面有小括号,前面有类型,表明是个函数。参数就是int a,返回值是int型。所以pquadrate是指向这样的函数的指针。
    查看全部
  • 栈内存中,gcc编译会作内存优化:1)使同一数据结构的变量在一起;2)先定义的变量内存地址会小于后定义的;3) 只有堆内存和栈内存可以写入数据,代码段的内存编译以后无法修改。
    查看全部
  • 指针变量char *str2 = "hello",用scanf 向str2中输入字符串出错,其实也可以这么理解,指针str2只是指向一个地址,从这个地址开始写入"hello",没有指定内存长度,没有空间去容纳字符串。内存溢出!这个与char str[] = "hello"不同,str已经有了6个字节的内存空间,
    查看全部
  • 1.论视频中出现的*p=&ap=&a

    请注意第一次时 int *p 是指针声明 =&a 这是赋值。第二次的 p=&a 也是赋值 但是p前面没有加* 因为已经声明过了 除了声明地方之外的*p 意义为:取p这个指针变量所指向的地址中的值

    2.p++:指针偏移,运行效率高

    3.p+3与*p+3区别:前者是把现指针向下移动三格,后者是对指针所指地址的变量进行操作(数学运算加3)

    (Plus:p+=3与p=p+3等同,加的是步数,原理跟p[3]一样)

    4.为什么p+4;*p=101 与p[4]=101等价???p[4]=101代表从初始位置(a的地址就始)以四个字节为一步,向前走4步,到达某个位置,然后对这个位置进行初始化赋值,即把101赋给这个地址所代表的内存空间。p[4]代表从初始位置(a的地址就始)以四个字节为一步,向前走4步,到达某个位置。*p=101,代表此时指针指向的地址(即走了四步后所在位置)并对这个地址所在的内存空间进行初始化,赋值为101。          

    5.i为什么1? GCC的优化,i是整形,在地址a之后。i初始0,循环一次后指针指向i,此时i+1=1(i++)

    6. 指针如何指向数组?e.g: ①int a[3]={1,2,3};  int(*p)[3]=&a

    ②int *pa=array; pa[0]=1; pa[2]=2; pa[2]=3;

    查看全部
    4 采集 收起 来源:指针运算

    2019-01-01

  • gdb调试:

    1、gcc -g main.c -o main.out 编程可以单步调试的程序;

    2、l 查看代码;

    3、start 从main函数开始执行;

    4、n  下一行

    5、p 打印

    6、s 单步,进入函数等

    7、bt  查看堆栈信息

    8、f *  切换堆栈

    查看全部
    3 采集 收起 来源:gdb工具的使用

    2018-04-01

  • 函数指针格式: 返回值类型 (*变量名)(形参列表); p pa指找到数据的内存地址(a的地址); p *pa指找到pa中的数据; p &pa指找到pa本身的地址。 quadrate在代码段时, p quadrate 函数的内存地址(quadrate ) p *quadrate 在地址前加*,表示通过地址取值 int quadrate(int a);是一个函数 int (*pquadrate)(int a)=&quadrate;则是指向这个函数的指针 int s=(*pquadrate)(a)可以调用函数
    查看全部
首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
本课程是C语言中级课程,为了更好的学习效果: 1、需要有一定的C语言基础,如果没有基础的同学可以看《C语言入门》这门课。 2、本课程是在Linux环境下讲解,需要熟悉一些Linux命令。如果不了解的话可以在《Linux C语言编程基本原理与实践》这门课程中补充
老师告诉你能学到什么?
1、C语言中的指针是怎么回事 2、Linux下gdb调试工具是怎样使用的 3、指针与内存有着怎样的关系 4、数组与字符串之间的联系

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!