作者TommyKSHS (汤米)
看板NTUEE113HW
标题[教学] Pointer III
时间Fri Nov 20 00:05:33 2009
然後今天来讲个
传址 ( call by address )
要讲这个,就要先讲个 传值 ( call by value )
所谓的传值,就是最普通呼叫函数时,传入 parameters 的方法
例如:( 以下为片段 code )
int max(int a,int b)
{
if(a>b)return a;
return b;
}
main()
{
int num1,num2;
cout<<num1<<num2;
cout<<
max(num1,num2);
}
好,相信大家对 call by value 已经熟到快焦掉了
切入正题
call by address 顾名思义
就是呼叫一个 function 的时候,传的不是值,而是 address
例如:( 以下为片段 code )
void func(
int *num)
{
*num *= *num;
}
main()
{
int x=4;
func(&x);
cout<<x;
}
还记得吗?
&x 是对 x 取址,然後 *num 是对 num 取值。
当我们呼叫了 func 这个函式的时候,依上面的 code
会同时执行
int *num =
&x; 这个动作
因此,当我们在 func 里对 *num 动手动脚 就等於对 main 里的 x 动手动脚
呃…所谓动手动脚就是指改变值的意思
上一篇我们讲到 阵列就是指标
所以 其实我们也可以传阵列的 address 给 function
像这样:
void print_array(
int *myArray,int size)
{
for(int i=0;i<size;i++)
cout<<myArray[i]<<endl;
}
main()
{
int s[]={1,4,3,2,5};
print_array(
s,5);
system("pause");
}
其实 int *myArray 也可以写成 int myArray[] 喔 ( 代表我们传入的是一个阵列 )
以上在呼叫 print_array 时,会执行这个动作
int *myArray =
s;
来点应用吧~ 上面的 code 可以写成
void print_array(int *start,int *end)
{
while(start<=end)
cout<<*start++<<endl;
}
main()
{
int s[]={3,4,2,9,1};
print_array(s,s+4);
system("pause");
}
这里补充一个上一篇没讲到的东西
int a[]={10,12};
int *ptr=a;
那
cout<<*ptr++<<endl;
cout<<*ptr;
结果会是[同电桥]什麽?
答案是 等价於以下的写法
cout<<*ptr<<endl;
ptr++;
//也就是 ptr=ptr+1
cout<<*ptr;
於是结果是
10
12
所以要让 ptr 所指向的 address 所存的值递增 1
要这样写
(*ptr)++;
然後上面那个邪恶板的 print_array 看的懂的话就表示你已经对指标出神入化了XD
看不懂的话…也不用太担心啦…(不过期中 or 期末可能会出现 (?))
总觉得我讲得一篇比一篇难懂… Orz
--
╭═══╤═══╮ ╰═╮ ╭═╯
│ │ │╭═和平,土地,面包═╮ │ │
│ ╭═╧╧╮╤═╤═╮═╤═╤╧╮ │ │
│ │ ││ │ │ │ │ │ ╰═╤═╯
│ │ ││ │ │ │ │ │ │
╰╧╯╰═══╯╰ ╰ ╰ ╰ ╰ ╰ ─╯
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.239.191
1F:推 jim1029:头推,还蛮白话的吧 11/20 00:14
2F:推 b98901056: 推汤米大神的经典文!! 请问C++可以指定指向位置吗?? 11/20 00:16
3F:→ jim1029:最後一个为什麽麽自动换行啊 11/20 00:17
4F:推 concise:唷呼~ 汤米好帅 11/20 01:15
5F:→ TommyKSHS:回三楼 因为我写错了 XD 11/20 01:30
※ 编辑: TommyKSHS 来自: 140.112.239.191 (11/20 01:30)
6F:→ TommyKSHS:二楼可以说的再具体一点吗? thx 11/20 01:31
7F:推 b98901056:我想要一个pointer指到我要的记忆体位置 可吗? 11/20 01:43
8F:推 a088753349:终於PO了~(泣...) 11/20 02:06
9F:推 hanmicky36:推~~神! 11/20 03:47
10F:→ TommyKSHS:回 056: 这方面我就不太了解了。 11/20 07:50
11F:→ TommyKSHS:但是要指向一个记忆体位置 前提是那个位置有被allocate 11/20 07:52
12F:→ TommyKSHS:不然对它取值的时候会爆炸… 11/20 07:53
13F:推 schimtag168:惠斯同电桥的梗不错xdd 11/20 13:11
14F:推 b98901056:喔了了 THX 我想要指别的程式allocate的 11/23 09:57
15F:→ TommyKSHS:这麽高深的技术我不会阿 XD 11/23 19:41
16F:推 b98901056:不是啦XD 假如我已经pop出一个0x1111ffff好了 11/24 01:40
17F:→ b98901056:那我有办法用C+的pointer要他指到这个位置吗@@(诚心) 11/24 01:41