1
smdbh 2019-04-27 22:06:49 +08:00 1
java 如何修改物理内存?
|
2
MonoLogueChi 2019-04-27 22:07:34 +08:00 via Android
我是从 C#开始编程的,为什么 C 艹的指针这么难
|
3
lhx2008 2019-04-27 22:08:05 +08:00
并不难,指针是一个地址,而 Java 的变量就类似指针
|
4
inoki 2019-04-27 22:09:19 +08:00 via Android
直接操作内存的都难,试试看汇编?
|
5
Halry 2019-04-27 22:13:15 +08:00 via Android 1
不难啊
|
6
iceheart 2019-04-27 22:19:44 +08:00 via Android
撸撸汇编就明白了
|
7
exch4nge 2019-04-27 22:21:50 +08:00 via iPhone
因为 C 语言更接近计算机,可以多去看一下汇编,了解一段 C 语言对应的汇编会对指针理解有所帮助。
|
8
akira 2019-04-27 22:23:47 +08:00
觉得指针难的 是根本没理解内存是如何存在 如何管理的
|
9
AngryMagikarp 2019-04-27 22:25:45 +08:00
学 C 语言一定要和操作系统原理一起学
|
10
lookas2001 2019-04-27 22:30:27 +08:00
大概是因为数学中没有指针这一个概念?
多写一写程序,就懂啦~ |
11
findmyself 2019-04-27 22:30:31 +08:00 via iPhone
指针都觉得难的话只能说 cs 基础太差了
|
12
limuyan44 2019-04-27 22:32:46 +08:00 via Android
因为这个问题很初级。。这才是问题,基础。
|
13
missdeer 2019-04-27 22:45:05 +08:00 via Android 2
并不难,难的都是不实用的炫技
|
14
whwq2012 2019-04-27 22:45:18 +08:00
一级指针其实很简单吧,难的是三级及以上。。。。
|
15
Northxw 2019-04-27 22:47:50 +08:00
指针真的不难,作用还很大
|
16
kokutou 2019-04-27 22:49:24 +08:00
指针难在这个有一点绕。。。
就跟揣摩话中话 /话背后的意思一样。。。 |
17
reus 2019-04-27 22:51:39 +08:00 4
因为你没有学过计算机原理
简单来讲就是一个内存地址 但如果你连内存是什么都不知道,连程序怎样操作内存都不知道,那当然觉得指针难以理解 C# / java 不让你直接操作内存,所以你没有学,所以就觉得难 所以从 C# / java 开始学编程,就学不深入,就学不到基础知识 |
18
WANGJIEKE 2019-04-27 22:55:09 +08:00
我觉得指针难在它提供了“非直接”的方式去访问 /修改数据,不过这也是指针作用大的原因。。。
|
19
liwufan 2019-04-27 23:09:07 +08:00 1
为何 C 指针这么难<能从具体实例问题出发解释为何指针这么难吗?
乞题了吧? 这题没有正确答案 |
20
Levox 2019-04-27 23:37:29 +08:00
觉得难是理解没到位吧。基础不稳就是这样。
|
21
lynskylate 2019-04-27 23:41:35 +08:00 via Android
单纯的指针概念不难,难在内存管理,这个指针指向对象的生命周期你很难了解,尤其是大项目,一不小心就可能忘记 free 或者 free 了非法内存。当然,这些一般有约定俗称的规矩。
|
22
ipwx 2019-04-28 00:02:52 +08:00 4
楼上的说法都是指针不难。但我觉得并非如此,指针确实不是 elementary 的编程范式。
这个问题的实质在于,有些程序根本不是 elementary 的编程范式能写完的。 追求性能的算法,为了抠复杂度里面的常数,需要手工管理内存分配、需要尽可能避免条件分支带来的 cpu 流水线失效开销,需要注意 cpu 的 L1、L2、L3 缓存。这些都只有 C++ 才能搞定,Java 不行,C# 也不行。 没错,Java 也能写算法。不用指针,用数组,用下标。实在不行就无脑 new,反正 gc 会回收。除了最后一条,C++ 也能用数组,也能用下标。但是就无法优化到流水线和缓存都妥当的程度。 - - - - 这里随便给你看一个 C++ 实现的哈希表,里面不仅有一级指针还有二级指针,顺便还有 memset、定长数组这种写算法题最常用的手段,你可以感受一下: https://gist.github.com/haowen-xu/c73fa08f6450b6d8dec9605ae0aa320a |
23
b00tyhunt3r 2019-04-28 00:17:01 +08:00 via iPad 1
说不难的都是没刷过国内考研题集的 用谁还不会用啊- -;
|
24
lance6716 2019-04-28 00:40:44 +08:00 via Android
@ipwx 这个哈希表写的挺一般啊…而且你说的那些也不是 C++写代码能搞定的,而是编译器优化的好吧。像是循环展开、条件传送啥的也跟指针没啥关系啊
|
25
CodeCommunist 2019-04-28 00:45:25 +08:00 via Android
课程编排问题,如果先学计算机组成原理和汇编就不难了
|
26
shijingshijing 2019-04-28 00:52:45 +08:00
我觉得一个比较好的例子是指向函数的指针,其他的一般指向变量的指针,数组的指针其实只要理解了底层原理并不难。而函数的指针则不太一样,指向(函数的指针数组)的指针则更进了一层。
以 Java 和 C#中的订阅模式为例,为什么发布者( Publisher )一旦达到某种条件就发布消息,订阅者( Subscriber)就能根据收到的消息执行对应的操作?实际上是因为发布者维护了一个函数的指针数组 or 链表,一旦达到某种条件,发布者就会依次执行这个函数的指针数组 or 链表中所有指针指向的函数。 不管是 C++还是 Java 还是 C#都是基于这个原理来实现的,只是各自有不同的表述或者实现时略有差异。 |
27
masker 2019-04-28 01:23:40 +08:00 via Android
我是从 PHP 开始学的编程,自考计科专业,课程有学 c,但我觉得指针并不难
|
28
Phariel 2019-04-28 01:29:45 +08:00
你要不从 Golang 学起吧 指针这东西是有点绕
|
29
chenjau 2019-04-28 02:03:49 +08:00
花一个月学下汇编. 8086 的汇编即可, 对于指针的了解会有很大帮助. c 是为了解决汇编的痛点而产生的. 你了解了汇编, 不但会知道指针是啥, 而且也能了解为啥要指针.
|
30
boris1993 2019-04-28 02:30:04 +08:00 via Android
我的体会是,老师胡逼讲,打个比喻就能说明白的事,非要东扯葫芦西扯瓢整的巨 TM 复杂
指针就是胡同门牌号(内存地址) 指针指向的就是那个胡同的口(地址指向实际某个内存区域的起始位置) |
31
silvernoo 2019-04-28 02:32:39 +08:00
难得是指针的指针的指针
|
32
xiadong1994 2019-04-28 03:08:33 +08:00 via iPhone
指针概念本身不复杂,复杂的是实际使用的时候。从低往上学一般就不会有这种问题。
|
33
jim9606 2019-04-28 03:22:52 +08:00
如果你是对编程概念“指针”(保存指向一个内存地址的变量)疑惑,慢慢习惯吧,因为这涉及到内存的概念。
如果你是对 C/C++的几种引用方式疑惑(引用、左值引用、右值引用、裸指针、智能指针),我觉得这是 C/C++为了贴近底层的理念和历史遗留原因。 |
34
GeruzoniAnsasu 2019-04-28 03:31:57 +08:00 13
指针不“指”向任何东西。
一个叫做 pointer 的东西但却一点“指”的语义都没有,还要让人去以箭头的概念想象它的作用和细节,当然会令人感到困惑。 在我初学 C 的时候(初中)指针这一张死磕了 1 个月都没怎么看懂。一个叫做 a 的 int,它里面放了 1,要用它的时候用它的名字 a 代表它,要改它的值的时候 a=2,就行。这个语义很直观。 但要想象一个“指针”: 一个叫 p 的“指向 int ”的指针,它指向 a,到这里都还很好理解,可是!! 1. a 的地址跟 p 是 tm 什么关系? 2. p 的地址跟 p 是 tm 什么关系? 3. p 的地址咋就又成指针了?没有东西在指它啊??? 4. 把一个箭头传进函数里是什么鬼,这个意象好难想象 5. 蛤?修改箭头的指向本身?为什么我不能把箭头放进一个函数里让这个函数改这个箭头就完事了?? 6. 为什么修改 a 里边的值我不能把 a 传进来,必须传一个指着 a 的箭头??明明 a=2 却可以 上面的意象中是含有矛盾的地方的(比如修改 a 的值不能使用 a 这件事)如果把指针想象成箭头,一定会陷入上面的某些困惑里。但实际上指针并不是这种东西。 C 语言其实跟汇编极其接近,别看 C 有这么多内置类型(初中刚学的时候两周卡在第一章的数据类型上差点没放弃),实际上语义上总共也就分为两种,值和地址。 放值的变量,就是那堆 char int float..一开始学背单词背了好久的类型 放地址的变量,就是所谓的指针。 指针不“指”向任何东西,它不是箭头,它仅仅是放了地址的一个变量。 题主问的是指针为什么会这么难,本篇回复也主要想讨论为什么看起来会这么难。我对过去学习的历程一直有记忆与不断的反思,所以大概还能想起一点点当时的想法,但说实话现在已经完全没法理解到难点在哪了,全凭印象。 实际上我接触汇编比接触 C 早,但刚开始的时候依然很难理解指针是个什么鬼东西。因为刚开始学一门语言的时候,你摸不清那些语句的语义细节和全貌是怎样的。就比如同样是闭包这种概念,有谁能说出来在 js golang python c++里,闭包 capture 的是引用还是值?一个相似的概念在不同语言里语义很可能都不一样,更别说完全陌生的东西。 pointer 在我看来是个十分糟糕的抽象,赋予了某种完全误导的意义。如果 pointer 这种类型叫做 address type,可能理解它就完全不需要这么费劲,只需要解释一下值传递以及地址的作用就好: 参数传递时会把外面的值复制了一份放到函数里面的叫另一个名字的变量的地址上去。就算只是作为规则默认接受也要尝试用箭头的意象去理解指针然后再尝试解释为什么要用箭头才能修改函数外的变量的值要容易得多。更糟糕的是为了拟合“指针”或者“箭头”这种抽象,设计了一个真是箭头->的操作符。这个操作符完全不能解释 strcut *p; p->是在干什么。它还不如设计成 assign/binding 用的 operator,比如 let p -> a ;也要比 int *p = &a 这种看起来多此一举的 declaration 要直观得多。(当然如果能理解 declaraion 到底在“声明什么”的话还算能理解为什么得写成这样) 所以会的人,尤其是理解了指针就是放地址的变量的人,是很难再想象到指针难点在哪的。指针很难学纯粹是因为设计时期采用了一个令人迷惑的抽象才造成了这种现象。观察一下其它的高级语言,大多数用“引用”这个概念去对变量的地址进行抽象。这个概念真的要比“指针”准确得太多,所以很少见到有人会说引用的概念很难理解或很难学。当遇到深浅拷贝的问题的时候也很容易理解复制一个地址跟复制其中的值是两码事。 顺带一提 c++里既有从 c 继承来的指针也有跟其它高级语言无限相近的“引用”概念,题主如果还没学过的话可以猜一下“一个指向引用的指针”应该是个什么东西 のωの |
35
b00tyhunt3r 2019-04-28 05:35:11 +08:00 via iPad
|
36
GeruzoniAnsasu 2019-04-28 06:10:03 +08:00
|
37
gramyang 2019-04-28 06:34:02 +08:00
指针并不难,指针是非常的复杂,容易产生错误比如野指针。所以才用类似智能指针,GC 等一揽子自动解决方案来屏蔽对指针的操作。
|
38
dezhou 2019-04-28 06:58:53 +08:00 via Android
你学好 java 就行了,最多看看 python
|
39
mmdsun 2019-04-28 07:03:53 +08:00 via Android
|
41
XiLemon 2019-04-28 08:00:06 +08:00 via iPhone
看下 CSAPP 里面的第三章,有些基础的汇编内容和 C指针的讲解
|
42
jzq526 2019-04-28 08:10:03 +08:00
指针比较难,不过多练练就好了,你可以试试写几个链表之类的练习,很快就能理解
|
43
xuanbg 2019-04-28 08:12:14 +08:00
指针很难理解吗?你拿张白纸画一些格子,里面写上一些数字。指针就是第 x 行第 y 列的 xy 值而不是那个格子里面写的数字。
|
44
smallX 2019-04-28 08:16:11 +08:00 via Android
JAVA 引用型变量
|
45
MonoLogueChi 2019-04-28 08:20:27 +08:00 via Android
@mmdsun C#里是个残废的指针,而且需要 unsafe,最重要的是没有必要用指针
|
46
babedoll 2019-04-28 08:38:12 +08:00
不难的,如果大学刚学 c 语言,去网上看看博客就懂了
|
47
zyy314680012 2019-04-28 08:43:37 +08:00 via Android
指针难吗?不熟的话画图分析。
|
48
DiamondY 2019-04-28 08:49:00 +08:00
了解一下微机原理(计算机原理)就好了,有些概念是需要一些基础作为媒介去理解的
|
49
wizardoz 2019-04-28 09:04:30 +08:00
指针就是内存你地址,捋清楚了这个就不难
|
50
xiangdong1987 2019-04-28 09:33:07 +08:00
指针不难理解,但是难于使用,用好指针的都是高手
|
51
karllynn 2019-04-28 09:57:02 +08:00
指针能有 monad 难么
|
52
dazhangpan 2019-04-28 10:13:07 +08:00
指针本身就是一个存储内存地址的变量,困难的部分不是它的概念混乱或是操作复杂,而是你可以给内存中的数据不同的解释。同样一段数据 00101011101010101,可以是 int,可以是 float,也可以是某一个结构体,这完全取决于你。其实指针的本质是你如何创造运行在计算机里的这个小世界,可以参看拙文《唯识与 C 语言指针》:https://decodezp.github.io/2018/12/31/thoughts2-weishi-c-pointer/
|
53
BingoXuan 2019-04-28 10:17:08 +08:00
现有架构上,所有数据都在存储设备上,当修改任何数据时候,你必须知道数据在哪。所以就抽象为指针。任何一个值都有着一个地址,或者这个值就是地址。
|
54
luozic 2019-04-28 10:25:35 +08:00
指针概念不难,但是你 Y 寫的程序怎麽保證在各種垃圾 CPU/内存上跑起來很難。安全+高性能才有用。
|
55
jziwenchen OP 楼上说不难的 甚至自学 PHP 说指针不难的是应该没有真正在生产上写过 C 吧?
像野指针 内存溢出 内存对齐 是不是都和操作指针有关呢? |
56
jziwenchen OP @dazhangpan 感谢. 你说了一些本质 有具体的错误使用示范吗
|
57
imbushuo 2019-04-28 10:51:28 +08:00
先去理解 load/store 或者 register/memory 两个模型后你会发现指针挺简单的(
|
58
wutiantong 2019-04-28 10:55:05 +08:00
@jziwenchen 我打个不恰当的比方,那些在生产环境上搞出 rm -rf /* 的人会不会觉得 rm 是个很难掌握的东西呢?
|
59
newtype0092 2019-04-28 10:57:27 +08:00 1
一个简单的办法,不管简单还是复杂,所有声明指针变量的地方不要直接用*,要用到的指针类型全部 typedef 的清清楚楚,这样一眼就看懂了。
|
60
tiedan 2019-04-28 11:15:31 +08:00
想起了 nginx 的四级指针。。
|
61
jianghu52 2019-04-28 11:18:50 +08:00
其实不是指针难,主要是楼主你学的 C# java 这种高级编程语言,把本来很复杂的编程语言给抽象的符合人类直观感觉了。所以当你学 C 的时候,指针会让你觉得很难。
从人类可以理解的代码,到 cpu 真正执行的指令,中间隔了很多东西。每一层都是一种新的语言。而相对于来说,C 语言本身更加关注内存,所以他有指针,还有垃圾回收。而 C#还有 java 本身的环境( freamwork,jvm )他们自身已经将内存操作以及垃圾回收都已经包含了,所以指针的概念就消失了。 这也就是为什么楼主你学习指针困难的原因。 至于要怎么学好指针,我个人推荐的方式是去理解编译原理,不要求你真的对于编译原理有多么高深的理解,只是希望你能在头脑中真的有一个关于内存的概念。 int a = 1 a = 2 以上两句 java 代码是不包含指针的,但是在内存中他们开始是什么样的,赋值之后又有了什么变化。如果你能很容易的回答出这几个问题,我觉得指针对你来说,应该就不会再觉得很难了。 |
62
DOLLOR 2019-04-28 11:34:48 +08:00 via Android
C 语言的指针难,可能是因为* &这两个符号带来的迷惑。
定义一个指针: int *p = &i; 使用指针的时候: *p = i; 在这里,两个*p 的含义是完全不一样的,这对新手来说,会造成很大的困扰。 |
63
Cukuyo 2019-04-28 11:39:44 +08:00
听说 nginx 之所以快是因为里面用的四级指针来着
|
64
fromdark 2019-04-28 11:58:28 +08:00
指针本身并不难,之所以难是因为大部分学校的老师教的很烂,教材也用的很烂(比如某谭),基本上 C 的学习都是应试驱动,考题也考一些乱七八糟的东西。选择一本好书,指针并不难。
|
65
qqor 2019-04-28 12:25:33 +08:00 via Android 1
一群人曾经谩骂 c++高手指针乱指的问题,看来到现在这问题还没解决
|
66
dingyaguang117 2019-04-28 12:26:02 +08:00
指针不难,难的是内存管理
|
67
q397064399 2019-04-28 13:08:55 +08:00
因为你没学汇编语言,C 语言说的好听的就是高级一点点的汇编语言,本身只在汇编上面包装了一点点东西而已
|
68
chitanda 2019-04-28 13:28:51 +08:00 via Android
不难吧。有指针可以做到很多优化。比如 Python 合并两有序列表,用 iter 不能退回到上一个,指针直接--就行了
|
69
littlewing 2019-04-28 13:30:58 +08:00
先学计算机组成原理,再学汇编,然后学 C 你就会觉得很简单了
|
70
q397064399 2019-04-28 13:59:49 +08:00
C 语言 = 汇编语言 ,, 两者一定要同时一起学
|
71
Cloutain 2019-04-28 15:05:37 +08:00
完全称不上难,搞清楚各种内存布局和操作系统的内存管理才叫难。脚本语言一样,脚本语言从某种程度上实现近似指针的功能就和汇编语言没有多大的区别了。
|
72
jackmod 2019-04-28 15:21:33 +08:00
C 语言不是一门语言,而是它背后的一整套体系。建议阅读 CSAPP。
|
73
salamanderMH 2019-04-28 15:43:10 +08:00
C 语法不难吧
|
74
myself659 2019-04-28 17:03:44 +08:00
加一层原理 indirect 了解一下
|
75
phoolean 2019-04-28 18:16:43 +08:00
你应该说一下这个“难”指的是概念上难以理解还是使用时难以操作?
如果是概念上难以理解,可能是因为计算机原理没学好; 如果是使用时难以操作,可能是因为写的代码少了不够熟练。 |
76
kahohuru 2019-04-28 18:50:12 +08:00 via Android
是挺难的,当年写个植物大战僵尸的外挂就用到了指针
|
77
dfjslkjdf 2019-04-28 19:45:06 +08:00
是不是因为容易出错?
|
78
wtdd 2019-04-28 20:04:40 +08:00
指针的本意很容易理解,难的是那些操作以及符号,设计的比较奇怪
|
79
fghjghf 2019-04-28 21:24:58 +08:00
完全因为你没了解指针而已。你了解透了,会觉得 C 很简单。CPP 的语法才是最烦人的。面向对象、过程、范型,
|
81
qiukun 2019-04-29 08:24:07 +08:00 via Android
内存是一个 byte 数组,指针存 index,*号可以取对应内容,&某变量可以取地址(内存上的 index)
that's all |
82
exploreXin 2019-04-29 09:26:55 +08:00
内存地址比喻成酒杯,那么地址里存的值就是酒,酒杯装酒,这是很好理解的。但是你见过装酒杯的酒杯吗,也就是酒杯里装的是酒杯,这就是指针变量的大致比喻,因为生活中不长见到这样的场景,所以也就不好理解了。如果要深入理解指针,前置知识有计算机体系结构,计算机硬件知识,另外还要有一些操作系统的知识打底,才能充分理解指针,觉得指针难理解只是前置知识不够,如果这些前置知识你都学的很溜的话,指针也就迎刃而解了,只是目前市面上大多都是业务逻辑程序员,函数类库都有人给封装好了,拿来直接用就行了,没有机会直接面对底层问题,所以对指针会很疑惑。
|
83
no1xsyzy 2019-04-29 09:36:07 +08:00
简单↔复杂
方便↔麻烦 这是两个不同的维度 其实 C 是简单而麻烦,而未经封装的指针正是麻烦的根源。 一种通用的封装叫做引用,正是 Java 的核心。 |
84
notreami 2019-04-29 10:20:53 +08:00 1
都不专业啊,说难或者不难的,上代码啊。。
扯犊子半天,写 ppt 嘛? |
85
ismyyym 2019-04-29 11:17:02 +08:00
有人故意炫技,就会很难。
我武汉一 985 的,大学时计算机组成原理和汇编考试都 90+,但当时看很多代码,还是头晕。 |
86
marsgt 2019-04-29 13:01:28 +08:00
C 是老大哥,老大哥踩过的坑,后边小辈肯定就默默的绕过去了啊。。。所以 C 一开始就相当于没有任何任何优化,到了后边像是 C++、Java 啥的就都会或多或少在语法上进行了改进,所以你如果先学的是后边的,再学前边就会觉得原始。但其实 C 更多的会更贴合硬件的设计,所以掌握硬件原理以后,相对的学起来会对理解有所帮助~(但并不是说会了硬件学 C 就没压力了,只是有帮助而已;硬件由会到懂,这个阶段可以很长。。)
|
87
marsgt 2019-04-29 13:10:38 +08:00
而且好教材真的很少。。🤦♂
国产就不说了,大学接触过某位老同志的基本上都踩坑了吧。。唯一我看过一本还能看的是《 C 语言编程魔法书》,是讲 C11 的(很新哦)。 欧美译的大部头,有单讲指针的可以看看;日译的有本《明解 C 语言》,只看过几眼。不过就我对日译作品的整体观感而言,可以一看~ |
88
acgzy 2019-04-29 13:19:23 +08:00
先学习汇编的话指针就更容易理解了
|