作者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