作者devilarise (Devil)
看板C_and_CPP
标题Re: [问题] 找记忆体位置
时间Sun Nov 29 11:15:05 2009
本文回给VictorTom:因为想说的颇多, 所以就不洗推文了
首先, 谢谢你的指教@@
1.
:我觉得您自己先把pointer和address给分清楚再说
请问你认为是哪边不够清楚呢?
2.
:文中一堆"指标"字眼用的位址很奇怪
请问你认为哪边使用上很奇怪呢?
3.
:还有, 个人觉得你C++的传址的观念有问题
恩, 我大概描述一下我的观念, 请你再指教一下好吗?@@
以一个
int a = 10;
这样的宣告来说
我认为是宣告了一块记忆体位址, 存放了10这个值
比较具像的表示是
变数名称a
变数内容10
变数位址0x123456
大致上是这样的
而我若宣告了一个int b;
然後写上 b = a;
这是为一种传递"值"的拷贝动作
电脑会将a的值, 复制一份给b
而如果写成 int* b = &a;的话
视为一种传址的动作
从此a跟b两个变数的记忆体位址
同时指向0x123456这个位置上
因此, 无论改变哪个变数
另一个都会同步改变, 因为他们都是同一个记忆体位置
4.
:严格来说, char *s=&str[0]; 是一个传值的动作, 它是把str[0]的address传值到s去;
在这里我看见的是指标的传递说@@ 请问哪本书教你
pointer variable = &variable;
这样的写法是传值而非传指标呢?@@
我想去拜读一下
我能猜到你大概是这样想的
这里我们都明白, char* s; 宣告了一个空指标,
没内容, 随机在记忆体内取一个没用到的空间,
所以把&str[0];的记忆体位址填写进这个指标内
而如果你认为的传值传址议题
不是在讨论, 传递指标, 还是传递内容值的话
那只能说我们都没啥错, 只是因为在受教育的时候
我就根深蒂固的学习了老师那派的看法
只要是传递指标, 就是看成一种传址
5.
:除非宣告的是函数int swap(int &a, int &b);
:通常这种我们才在讨论传址呼叫; 想请问您觉得int swap(int *a, int *b);
:是传值还是传址??
那个, 请问"我们"是指哪个团体? you and me? or ...?
如果是某个超有成就的学术单位, 还请务必赏赐个网址来给在下拜读一番@@
就你所写的两个函式原型来说呢
我的理解是第一个是收两个"参考值"reference
第二个收的两个是"指标"pointer
第一个函式放进去的是两个参考变数
不过参考我很少在用, 理解不够清澈
这里就请其他前辈赐教了@@
第二个函式放进去的, 是两个"指标变数"
这两个指标变数的大小都是一样的(应该说, 所有指标变数的大小都一样)
都是4byte, 然後这个指标变数存的"值", 是另一个变数的记忆体位址
没错, 这两个函式的最终结果都一样, 会是记忆体位址的互换
但是, 用台语的说法就是: 一样就不同师父勒
一个是参考的交换, 一个是指标的交换
然後最终的成果都是指向的记忆体目标交换
即原本a 指向12345, b 指向67890
变成了a 指向67890, b 指向12345
但是实际上的记忆体位置是没有变动低@@
不知道我这样解释够不够清楚?@@
5.
:利用指标操作另一个阵列本来就是在学习
:pointer/array/address时的基本功, 也是应该搞清楚的地方
:原原po应该在这边把指标的观念慢慢开始摸懂,
:而不是因为这样什麽传值传址的不要这样写....~_~
如果你认为char这个比较模糊的地带
是很适合新手练习指标观念的地带的话
那我也没什麽好说了@@
不过我是认为用些比较直观的型态来教指标观念会比较好
比如说
int a = 10;
int* pA = &a;
这样比较浅显的东西
如果要教指标与阵列的关系
int a = 10, b = 20, c = 30, d = 40;
int Ace[4] = {a, b, c, d};
cout << *(Ace+0) << endl;
cout << *(Ace+1) << endl;
cout << *(Ace+2) << endl;
cout << *(Ace+3) << endl;
这样不知道会不会比较好一点
喔, 对了, 我的习惯是, 我张贴的程式码
一定有经过VC2008编译器的确认@@
不会凭空乱写...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.133.240
1F:推 RebeccaHall:回得好仔细~!! 11/29 18:01