作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 找记忆体位置
时间Sun Nov 29 12:19:03 2009
※ 引述《devilarise (Devil)》之铭言:
: ※ 引述《Ducray (贤贤)》之铭言:
: : {
: : char str[6]="abcde";
: : char *s;
: : s=&str[0];
: : cout <<s<<endl;
: : }
: 上面第一行, char str[6]="abcde";
: 说的是, 宣告一个char形态的阵列, 阵列内, 存六个char字元的"指标"
不对
存六个 char 指标的阵列
是这样宣告的:
char *str[6];
写 char str[6] 只是宣告一个阵列存六个字元,不是六个字元的指标
: 所以, 单看char str[6]这段, 其实是一种指标的宣告
不是的
指标和阵列很像,但有微妙的差异
: 而且是一种连续的记忆体指标宣告, 其所需的空间大小必须被写死
: 并且在程式开始执行时, 就配置好这个空间
嗯...也不是
如果宣告在 function 内,它会配置在 stack 上
也就是在执行到该 function 的时候配置空间
而不是开始执行时就配置空间
你可以试看看在 function 内宣告一个超大的阵列
如果不呼叫该 function
并不会产生任何错误
但一呼叫就会因为 stack 空间不足而造成程式中止
: 而看後面="abcde";这段, 其实是让电脑在记忆体配置出六个char的物件实体
: 依序将这六个实体的值配置成 'a', 'b', 'c', 'd', 'e', '\0'
: 然後将这六个字元的指标放入str阵列内
同上
是直接把值放进阵列
而不是把指标放进阵列
: 而第二行和第三行的意思是说
: 宣告一个字元指标, 并将这个指标用来存放str阵列[0]的指标(即指标的指标)
当然也不是指标的指标
s 单纯就是个 char* 指向阵列的第一个元素罢了
: 这样做法的後果是, 从此设计师去改动str或者改动s
: 另一个的值都将同步被改变, 这是因为, 他们指向同一块记忆体中进行存取
: 为什麽我认为这样写不好?
: 因为这是一种传址的动作
: 而一个初学者, 在他还搞不懂传值传址的差异之前
: 甚至在他完全不懂什麽是指标之前
: 这样的写法, 很容易让他在日後操作其他传值传址问题上卡住
就是为了要搞懂
才会这样写 然後拿问题来问大家呀
: 请各位回想一下, 自己还是C++初学者的时候
: char ch[10];
: 是不是总以为他跟int a;的宣告很类似
: 我是说, 那时候是不是都认为, 阿不都是变数?
: 然後有一天懂得阵列跟指标之後才发现,
: 原来char ch[10]; 其实是宣告了一种指标...
同上
阵列 != 指标
: 例如:
: int a = 10;
: int b = a;
: 这懂C++的人都看得出来是传值
: 不是传址
: 所以
: int a = 10;
: int b = a;
: a+=100;
: cout << b << endl;
: 以上的code输出的结果是10而不是110
: 但是如果把以上的例子改成发文者的char写法呢?
: 我输出b, 结果就会是110...
: 最好新手都跟指标是好朋友
: 最好这样写这样教不会误导新手=.,="
: 希望这样说, 各未能听懂我在说什麽@@
: 如果有错, 请务必多多指教
: 我很乐意学习低@@ 我很清楚我也不过刚入门罢了
: 还有很多需要学习...
加油...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.87.111
1F:→ devilarise:只能说我的表达能力真的很差=_="你说的我都能理解 11/29 12:24
2F:→ devilarise:例如阵列占用记忆体时机, 我写程式开始, 就是想写 11/29 12:25
3F:→ devilarise:开始跑这段程式码的时候...然後就被解读成: 11/29 12:26
4F:→ devilarise:程式刚启动的时候...一整个不同, 我会加强自己的表达@@ 11/29 12:27
5F:→ devilarise:anyway, 至此感谢各位的指教, 各位说的我都能理解 11/29 12:27
6F:→ devilarise:但我想说的是, 我的理解跟你们应该没有差异 11/29 12:28
7F:→ devilarise:只是我的表达能力远远不如各位 :( 11/29 12:28
8F:→ devilarise:还有, 就是请继续鞭我!@@ 这样我才知道我的解释多差@@ 11/29 12:30
9F:推 VictorTom:不好意思劳驾l大与b大s大回应了, 小弟因为准备出门所以 11/29 12:35
10F:→ VictorTom:一直只有零星推文Orz 另外l大的解释也比小弟自己吐得出 11/29 12:36
11F:→ VictorTom:来的清楚明白, 感谢也让小弟再更清楚观念. 另外如果原来 11/29 12:37
12F:→ VictorTom:的推文有让d大误解或不愉快的地方, 还请见谅....Orz 11/29 12:38
13F:推 twotwoone:大家真闲呀... 11/29 12:59
14F:→ MOONRAKER:阿星期天不闲哪一天闲啊 11/29 16:06
15F:→ VictorTom:哪有闲啊, 这两天都跑资讯展整个下午, 腰酸得要死...Orz 11/29 18:47