作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Fri Jan 8 19:32:25 2010
指标。
先附样东西
照今年猜题内容写的code
http://www.mediafire.com/?jknoozzu2zl
各自取用。
--
来讲解指标...这部份讲解请打开下页的的Book1.xls
首先,请想像整个表单是已经被分块的记忆体样貌
: 也就是指每个格子都代表某个变数使用的空间
空白的可能是未使用,或是其他变数的位置,就先当作是平常说「未宣告区块」那种状况
打开以後应该都是在Sheet1这
直接看,你会看到B3、J11各有个765465
这里把B3视做一个int变数,名称为A,位址当然就是B3、存放的内容是"765465"
再来看J11,姑且称为变数B,表面上都是765465,但是当你选取这格时
你会看到其实储存格内容是"=B3",像这样就是指标的用法
也就是,由一个变数B,去"
指向"被"
标记"的另一个变数A这样
所以修改显示值也好,移除数值也好,其实都是针对A在处理
这里的B只是一个中继点去表示A而已
对B做处理,最多最多就是我去把他标记的位置从B3移到B5这样而已
--
Book1.xls
http://www.mediafire.com/?jknoozzu2zl
这也是为什麽说,在同一个函式里面用指标通常是很蠢的事情
在自己面前有块饼乾,伸手就能拿来吃,干嘛没事还要叫人家帮忙拿呢?
所以说,这个指标就是用在函式间的连结
可能隔壁房间有我要找的东西,可是我现在忙着写教学没办法过去拿
因此,我请一个路人帮我拿过来给我
像这样的情况才会变得比较有意义
--
回到主题来,继续讲一下指标的用法
int A;
int *B;
这个*B的*,就是表示宣告为指标,至於指标为什麽还要特别指定型态这点
晚点会提到。
因为B这个名字,表示J11这个位址,而B只能存放另一个位址
: 请回头看Book1.xls
所以是不能用
B=A;
这样的写法的,因为这样是想把A里头765465放到B中
而不是把A的位址(B3)放进B,正确的写法是
B=&A;
&A即取得A的位址,然後利用=传入B里头
--
这里你可能会误写成
*B=A;
这样的行为当然是成立的,因为写成*B
就会令*B等同B所标记的位址 (变成那个位址上的变数)
在此例中,因为没有预设指定位址,所以会发生"不可预期的结果"这样
好,初步说明到这个阶段,再来是个小小的程式码
利用指标,从主函式传值到副函式输出、改变数值後,再回到主函式输出
--
#include<iostream>
using namespace std;
void print(
int *a)
{
cout <<&a <<endl;
*a=6
}
int main()
{
int b=2;
print(&b);
cout <<b;
}
--
输出结果是
2
6
这样,这里附带重新提一下
使用函式时副上的参数数
可以视为函式使用时是
int *a=&b
这样的状况,这样记也许比较能够避免错误
下页是阵列
--
这里可以翻到sheet2了
对於阵列与指标的关系,大致上可以说"阵列名称"就是指标
也就是呢...宣告一个阵列时,就只是指定一串记忆体为特定变数型态
然後由一个指标指定起点
比如说sheet2中
C2到H2就是一串阵列A
: 画成横的感觉比较顺,所以请不要挑剔(跑)
在电脑中只会去记忆&A=C2,然後每个变数占用的记忆体单位
这也是为什麽我们的阵列初始从A[
0]开始用,表示从被记录的位址数起第零个
所以说,在传阵列到函式时
用法会是
void funtion(
int *point){;}
int main(){
int name[
10];
funtion(name);
}
--
因为name 表示的就是一个位址,所以不用对name取位址(不用写成&name)
就能让函式内参数顺利接受这个位址
到这边都不是问题...吧(?)
对於这个阵列如何在函式内使用...
大概可以分成
1.照基本概念走 从位址起算 *(point+n) n为任意整数
2.当一般阵列用 point[n] n为任意整数
随意举个例
*point 等价於 point[0]
*(point+1) 等价於 point[1]
以下类推。
--
下一项是利用指标传二维阵列进函式
这部份先继续参照sheet2 C6:H8这段范围
就当作我宣告
int array[
3][
6];,表示这个二维阵列的样子这样
当然,传进去不能像一维那样使用,不然就没什麽好说的了
这里先有个基础,不论宣告几维阵列或阵列大小,在给予记忆体空间时一定是一串的
: 请翻到sheet3,C6:T6这整段才是array[3][
6]在记忆体的样子,而不是分布在C6:H8
而作为起点的位址也还是只有一个 C6,不会因为三列而有三个起点
可是,这个阵列大小是不会随着函式被传递的
不能说传进一个起点,就要函式能主动判断几列几行
: 利用指标控制阵列时,脑袋不清楚很容易用到不该使用的范围,请多加注意
所以说...要在宣告时告诉函式每一个子阵列的起点分别在哪
--
这部份的作法是:宣告一串一维阵列摆指标,然後让指标放各个阵列的起点
这样一个摆放指标的阵列,称为指标阵列
宣告方法是 (*point)[
6]
^^^^^^ ^^
变数名称 阵列大小
这个变数名称会再被传入的数值取代,构成一个二维函式
或许换个方式说成是宣告N个占用6单位记忆体的变数更能理解...?
: 拿回sheet3看,就是有一个变数代表C2:H2这段,下个变数表示I2:N2...(下略)
与 *point[6]不同,解释会变成
^^ ^^^^^^^^
指标 一维阵列 →→ 放六个指标的一维阵列
在意义上就有些不同了
正确用法如下
void funtion(
int *point)){;}
funtion(name);
--
好像没什麽好写的
就先这样好了(思)
--
违背命运是人之常情。
人们从在犯了错之後,才向神明祈祷以求补偿。
狼与辛香料 克拉福‧罗伦斯
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.114.76.199
1F:推 dosomethnig:GOOD 01/08 19:34
2F:推 gcobc12632:我想直接把以前全部写的作业都带过去 然後慢慢参考= = 01/08 19:56
3F:推 Arashinoon:未看先推 01/08 23:22
4F:→ j2612280:我发现错误啦!! 第六页的cout <<a <<endl;是印出住址 01/12 20:33
※ 编辑: game0416 来自: 58.114.76.199 (01/12 21:08)
5F:→ j2612280:呃..我说的是输出结果不是2啦~是住址才对 01/13 00:03
6F:→ game0416:输出内容才是那段的目的啊qq 01/13 00:11