[教學] Pointer III
然後今天來講個
傳址 ( 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
推
11/20 00:14, , 1F
11/20 00:14, 1F
推
11/20 00:16, , 2F
11/20 00:16, 2F
→
11/20 00:17, , 3F
11/20 00:17, 3F
推
11/20 01:15, , 4F
11/20 01:15, 4F
→
11/20 01:30, , 5F
11/20 01:30, 5F
※ 編輯: TommyKSHS 來自: 140.112.239.191 (11/20 01:30)
→
11/20 01:31, , 6F
11/20 01:31, 6F
推
11/20 01:43, , 7F
11/20 01:43, 7F
推
11/20 02:06, , 8F
11/20 02:06, 8F
推
11/20 03:47, , 9F
11/20 03:47, 9F
→
11/20 07:50, , 10F
11/20 07:50, 10F
→
11/20 07:52, , 11F
11/20 07:52, 11F
→
11/20 07:53, , 12F
11/20 07:53, 12F
推
11/20 13:11, , 13F
11/20 13:11, 13F
推
11/23 09:57, , 14F
11/23 09:57, 14F
→
11/23 19:41, , 15F
11/23 19:41, 15F
推
11/24 01:40, , 16F
11/24 01:40, 16F
→
11/24 01:41, , 17F
11/24 01:41, 17F