作者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++;
cout<<*ptr;
結果會是[同電橋]什麼?
答案是 等價於以下的寫法
cout<<*ptr;
ptr++;
//也就是 ptr=ptr+1
cout<<*ptr;
於是結果是
10
12
所以要讓 ptr 所指向的 address 所存的值遞增 1
要這樣寫
(*ptr)++;
然後上面那個邪惡板的 print_array 看的懂的話就表示你已經對指標出神入化了XD
看不懂的話…也不用太擔心啦…(不過期中 or 期末可能會出現 (?))
總覺得我講得一篇比一篇難懂… Orz
--
╭═══╤═══╮ ╰═╮ ╭═╯
│ │ │╭═和平,土地,麵包═╮ │ │
│ ╭═╧╧╮╤═╤═╮═╤═╤╧╮ │ │
│ │ ││ │ │ │ │ │ ╰═╤═╯
│ │ ││ │ │ │ │ │ │
╰╧╯╰═══╯╰ ╰ ╰ ╰ ╰ ╰ ─╯
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.239.191
推 jim1029:頭推,還蠻白話的吧 11/20 00:14
推 b98901056: 推湯米大神的經典文!! 請問C++可以指定指向位置嗎?? 11/20 00:16
→ jim1029:最後一個為什麼麼自動換行啊 11/20 00:17