从计算机底层认识指针!深入理解C语言指针!

作者: 爱上半导体分类: 计算机技术 发布时间: 2023-02-13 21:33:17 浏览:405762 次

从计算机底层认识指针!深入理解C语言指针!

清真LC:
我记得贴吧有个图,一步到位理解指针! 有人在JAVA吧问指针是什么? 答1:见C++吧,xxxx链接xxxx。 来到C++吧 答2:见C语言吧。 来到C语言吧 答3:见csdn。

【回复】这几个答案本身就暗含了指针的精髓[妙啊]只不过看起来像指向指针的指针[笑哭]
【回复】java应该不会问指针,大概率会问引用
星空长夜i:
学C的同学记住: 数组是数组,不是指针。 只有特殊几种情况下才可以讲数组隐式转化成非左值指针! ①只有在特殊几种情况下才会经历到指向其首元素非左值(也就是大部分书说的常量)指针的隐式转换。 ②指针是一种对象类型,它引用函数或另一种类型的对象,可以添加限定符。指针亦可以不引用任何内容,这通过一个特定的空指针值指示。 ③空指针≠野指针,也请不要对这二种指针使用间接运算符-解引用(否则是未定义行为) 关于这里个人打个小广告:个人在CSDN上发布一个文章:http://t.csdn.cn/EMoyK 说实话我都懒得更了,流量太少了,反而炒openai热度的倒是高。

【回复】数组是个楼,指针是个小纸条是写着地址。前者是按实际大小开辟的栈内存空间,后者是一个长度固定(32or64bits)的内存空间。我有楼可以给你写地址,但我捏造一个地址不能凭空盖出楼。
【回复】还有随便再讲一下 ①主函数 请使用int main 请不要使用void main 除非你是干单片机的,否则不要使用第二个方法! ②变量自己相加 标量在同一表达式当中发生了改变,请不要使用该标量,否则也是未定义行为,举个例子: i=++i+i++;
【回复】回复 @星空长夜i :如果我以上说的三个问题,在你使用的书当中出现了,请留下书名和作者。 然后把这本书丢在火坑里。[脱单doge]
清蒸萌新literal:
[捂脸] 指针是表达间接引用的语言特性。可能的应用场景包括访问远超值类型尺寸的对象,比如结构体,一块内存,字符串等对象,相比于对象复制,传递这些对象的引用(在 C 语言里就是指针)。 至于指针指哪了,先不谈虚拟内存机制,在虚拟内存空间中,全局作用域中的对象地址差不多是编译器决定的。而局部作用域中的对象由编译器分配栈帧,函数堆栈位置,运行时再创建栈帧,这些因素共同决定,因为每次函数调用都会创建新的栈帧,而且取地址运算符是一个运行时的操作,至少在堆栈上要算出当前局部对象的地址,并保存在指针类型的对象中。 至于指针的指针,指针类型的对象本身也会占空间,也可能由有地址,很正常的事情。

【回复】回复 @ThunderShadow :stm32之类的应该大部分都是物理地址,至少我接触的是这样,因为虚拟内存一般是为了并发和复用服务的
【回复】回复 @罗易斯 :你这个话说的是牛头不对马嘴,你根本没有Get到他在说什么。 这个UP是做硬件的,他对计算机确实不是非常了解。但是你这么武断的说数据不在物理地址里就是你不懂硬件了。 写嵌入式C(不是嵌入式Linux)要的不就是指针指向物理地址?MMU指针乱飘就不怕把电路烧坏了?至于多核、操作系统,对不起那些东西和我们都没有关系[辣眼睛]读写地址的时候就是在操作flash或者寄存器的真实地址。 从嵌入式的角度,这个UP说的原理是非常简化(甚至没有提到矩阵、寄存器),但是也不至于你说的漏洞百出[辣眼睛]
【回复】回复 @ThunderShadow :嵌入式如果不指向物理地址谁他mua敢用你这个程序,一下电指针乱飘,鬼知道会把硬件那块给烧了
山水又一翁:
确实做得不错,油管上此类短动画很多,国内确实要多做点

【回复】回复 @F凌天传说 :我已购买哔哩哔哩第134052532位水军会员,挑战人类答题考试获得60分。
【回复】回复 @F凌天传说 :是谁不许你学习了吗?摁隔这阴谋论
【回复】回复 @F凌天传说 :这不是工科必修吗?
芙卡洛斯唯一现任:
唤醒学单片机时,地址赋值的记忆[辣眼睛]

【回复】回复 @-Nekromant- :卧槽,我们就要开学考试了,你不要吓我[笑哭][笑哭]
【回复】回复 @-Nekromant- :嗯哼?刚开学
尹失紫:
哪个天才发明的这玩意啊[灵魂出窍] 计算机这东西我越看越不像人发明的东西[笑哭] 尤其是cpu。。。

【回复】我感觉很难吧功劳归功于某个人或者某个团队,当然也可以挑贡献突出的来讲。 从提出理论框架到硬件设计、程序设计、制造工艺……有无数的细节。每个人/团队解决一个很小的问题,集合起来就是一个恢宏庞大的系统。这是一群人经历很多次失败和更新迭代,最终形成的属于人类的知识结晶。[鼓掌]
【回复】这东西是因为早期通用计算机内存容量小,光是实现功能都费劲,按冯诺依曼结构就需要从外部存储器和内部存储器频繁的交换数据,为了实现cpu最高效的利用数据,内存让人类直接管理是当时的方案,现如今你在工控系统,嵌入式系统等以c预言为主流的开发上还会有这种方案,应用程序因为封装加上系统内存很大了,一般不需要进行这种操作,除非有人打算拿cpu的缓存做文章,不过除了cpu厂应该不会有人做这种开发了 在Java等面向对象语言里,指针应该被理解为对象在逻辑层和物理层之间的媒介,物理上是一系列物理内存地址,逻辑上是封装起来的一系列对象,编译器或虚拟机里会运行类似c语言指针的实现来进行对象的调度,粗略来讲,也可以说在面向对象语言里,指针即对象,对象即指针
【回复】Cpu这东西,学过以后发现真的厉害,根本不可能一次发明。这么多年从微观到宏观,各种机构和原理一层套一层。从电路直到高级语言。太厉害了
无暇摸鱼:
别学了学不会的,你个没有对象的野指针[doge]

【回复】没有对象的是空指针。对象被析构的才是野指针[doge]
【回复】我看不懂但我感觉你在公鸡我,我要反击了,你个什么对象都取的泛指针[doge]
【回复】c语言面向过程不面向对象[doge]
533325:
题外话,内存外存这东西看架构分的细,但绝大多数人没有也不需要了解那么深,所以说明时讲清楚就行。学的东西嘛,好多不完全实用,小学时数学老师讲说乘法可以讲增长几倍,但除法讲缩小几倍是错误的,只能说变为了原来的几分之几,当时认真做笔记记住了,考试时专门写了变为几分之几,老师直接打了叉,讲卷子时我又问老师,老师看了半天说哦对这样也可以,给我改成了勾,这个印象很深。还有那个说教材上面电路错误的,前几天刷视频看到的那个,人准备自己买东西做实验试试了。还有温度,学的时候温度这个物理量没有负值,-5度的负号仅表示温度在0度以下,就像数轴上0那边的一样,读时要读作零下,直接度负5度是错的,包括看电视天气预报人播音员从来都是零下,没读过负几度的,但换个角度,不是谁都上过学并且还记得这个知识点,日常交流知道啥意思就行了,语言不就是拿来交流信息的吗,目的达成就行,对了又怎样错了又怎样,不会的就是不会,不懂的还是不懂。运行内存机身内存这种混淆的,我一直以为的是,内存外存又可以叫主存辅存,前者高速小容量,断电丢失数据,后者慢速大容量可以断电保存,ram和rom也可以,但经常和人交流时要额外说明,不然就要被讲道理了,也很无奈

【回复】本来叫硬盘的现在叫内存,本来叫内存现在叫运行内存,这直接把名字都给混淆了,肯定不行;卖手机的不懂乱讲没什么,厂商也跟着这么写那就是蠢了
【回复】回复 @kliet- :我一直以为加上运行二字就是营销需要,“你看隔壁家的手机内存才4G,我们这里一样的价可是68G哦,比他们大多了”“68G内存里面有4G是运行内存,另外64G是机身内存,我都叫内存,但消费者有几个分得清的,不都是哪个说的好听会忽悠就买,你说的对了你可没卖出去哈哈哈”,也算是劣币驱逐了,所以厂商为了营销需要也只好叫成“运行内存”“机身存储”这样子。和有些人讲道理是不通的,有人就是要抠字眼,就像有人说软件是在内存中运行的所以就该叫“运行内存”,我都直接啊对对对
【回复】主要是中文翻译的问题,讲英文就很清晰了,所以理解英文原文才最重要
天纵神武李公子:
学指针就记得一句话:指针就是存储的东西为地址的变量[doge]

【回复】指针就是他妈的变量! 存的值稍微有亿点特殊罢了
【回复】回复 @-Nekromant- : 应该类似铭牌,上面写着门牌号
【回复】指针也可以设定为常量的
泸州小米粉:
内存之所以叫内存,是因为内存可以直接被CPU寻址,无关乎它是在CPU内部还是外部。就像很多单片机内部都集成了EEPROM,总不能说EEPROM是内存吧。

【回复】回复 @罗易斯 : ROM 早期的的概念是指存储 BIOS 的 ROM,它被映射到内存地址空间,也就是 CPU 能直接寻址,电脑上电后第一条执行的指令就是从 ROM 中读取的(不经过内存)。后来 FLASH 等出现后,把其归类到 ROM,由于 FLASH 慢慢的作为外部储存,所以 ROM 的概念也慢慢的变为了外部储存的意思。
【回复】如果我没记错的话, eeprom确实是可以被直接寻址的吧?
【回复】回复 @風吟鳥唱 :我觉得手机的栗子应该足够让你理解“内存”的内就是指设备内外了。而且二十多年前的教材诶,只能看哪天收拾屋子有意外发现了
Max丶chin:
指针所谓的地址是指系统给的虚拟地址,然后通过页表映射给物理地址

【回复】学生?病毒,确实也不难,一个简单的shell既可以用来保护程序,也可以用来当做病毒,做的好还可以当做免杀,根本不需要漏洞,杀软只能靠用户上传的特征码去死记硬背的杀毒 只不过一般人连pe结构都不懂,跟别提内核了。更不要说逆向代码了,上边的内容有点敏感我先删了
【回复】虽然了解的不是很深入 “内存管理单元还对实际的物理内存进行分割和保护,使得每个软件任务只能访问其分配到的内存空间。如果某个任务试图访问其他任务的内存空间,内存管理单元将自动产生异常,保护其他任务的程序和数据不受破坏。” 常理告诉我,真如你讲的那样,写个病毒不就太简单了(病毒大多利用的是潜在漏洞)。如果系统不留后门 ,一个野指针搞不出什么吧!
【回复】回复 @杜甫第一 :而且为什么不能野指针,是怕指向了系统里某些重要区域,导致系统出问题
倔强的参宿四:
爱上半导体× 爱上计算机✓ [脱单doge][脱单doge]

【回复】谁是半导体?谁是计算机啊?
EinZwei:
05:35 *p=&a 感觉有问题吧,应该是p=&a呀

【回复】没问题 她前面有个 char 所以是 定义并赋值!
【回复】回复 @kgbcccp :定义的时候,*是跟着前面类型走的,是int* p而不是int (*p)
【回复】回复 @qwertyu518518 :其实就是 int p 的时候代表 p 是一个int变量. int* p 的时候代表p 是一个 int* 变量,即p储存的这个地址所指向的位置上边储存了一个int变量。 假如int* p = 0xFF ,说明0xFF这个地址上储存的是int,然后你可以通过操作 *p 对 0xFF这个地址上的值进行修改,等价于*(0xFF)
Marsh_Joe:
现在计算机结构很复杂,高级语言里面的指针概念其实和机器语言里面的编码概念有相似之处但不是一个概念,虽然说学习终归是要知其所以然的,但是和理数定理一样,有些本身就被抽象出来的概念对于我们而言的理解基准就应该拔高一些。就像我们不会去考虑如何呼吸如何走路,如果时时刻刻想着如何走路,那永远也不可能会跑步。我认为学习就是一个把需要刻意注意的事情变成本能的过程。

位置目标:
你这种解释会让不懂的人更加懵逼的。。[呲牙]

【回复】这还听不懂?这比某些叫兽讲的强了不知道多少倍好吧[辣眼睛]
【回复】听不懂是对的,因为视频讲错了,指针就是内存条地址,cpu缓存一般是不让你访问的,实在不信的自己去vs随便抓一个变量地址算一下就知道了。
清风梅雨:
很多时候,同学们学软件会希望有硬件辅助理解,学硬件希望用软件表达,那么先学哪一个呢?大部分学校都给出了先学硬件再学软件的逻辑,不过当年我们学校是先学软件再学硬件,以至于软件老师都不敢讲什么是锁存器和触发器。不过,这样的学习经历,切实加强了我的自学能力。[doge]

【回复】这位先生说的是对的 。Win32系统 就是微软先实现功能 而后支持的C语言标准C89还是99我忘了 : 这就是典型的接口抽象(为了对接C标准) 再说直白点 Win32内核 就不是用的贝尔实验室C写的 大概率是一堆汇编指令集的拼凑 WinCE WinPE Win32 64位 … 反而苹果MacOS(Unix)和Linux是基于标准C89写的 一段C程序在Mac和Linux上编译通过 去VC下编译几百个错误 scanf函数报错 这个函数是C标准函数微软都没有实现 printf()让你改成Sprintf 简直误导新人!
【回复】这样学 可以 但也不完全对 还是要结合编译器原理学。
【回复】全都是自学,直接854和408上看看谁学会了,别的地方没人管你会不会
lt_littlekk:
AFOed的信竞人垂死病中惊坐起[灵魂出窍][灵魂出窍]

qwertyu518518:
平时讲模数电的up突然开始讲C语言 再往下翻是郭天祥老师直播讲三极管 换家是吧

【回复】回复 @qwertyu518518 : 情理之中,意料之外[滑稽]
【回复】回复 @50803813317_bili :我还等着听全套c语言呢[滑稽]
【回复】这是《模拟与数字电路》里的一部分,c语言是引子[笑哭]

计算机 程序 C语言 软件 编程语言 编程 硬件 指针 C/C++ 电子学

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!