iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
自我挑戰組

環島C一下自己的人生系列 第 7

[Day7]指標2 and 傳值(by value)及傳址(by reference or by address)

  • 分享至 

  • xImage
  •  

昨天的文章中有稍微介紹了關於指標的一些觀念
但皆僅限於main body中的介紹,因此就有了今天更詳細的介紹
該如何從Function中使用指標的方式來取值或址呢?

這邊有幾個觀念分為

傳值(by value)及傳址(by reference or by address)

假設有兩個變數

int x=1,y=2;
.
.
.
y=5;
如果今天修改y時,如果x沒被受影響那就是傳值(by value)

其中又有分語言
不同語言default上在傳遞變數是傳值還傳址時都皆不同

那麼傳址呢?
以下有個例子,也就是將變數的記憶體位址丟給其他變數
使得其他變數再修改數值時原本的變數也會跟著更改
這麼說可能有一點抽象,因此就以例子來講解

void f(int *a, int *b){
    *a=*b+2;
    *b=*a*2;
}
int main(){
    int x=1,y=2;
    int *p=&x,*q=&y;
    f(p,q);
    //f(&x,&y);
}

main body將p,q位址丟給function f並用指標指向該位址
之後當*a 修改值時x也會跟著變且*b也是如此
這種方式就是傳址的情況下會發生的
https://ithelp.ithome.com.tw/upload/images/20220922/2015249554Z81uX8VZ.jpg

OK,如果上面介紹都能消化的話那就再來雙重指標的部分 到底要逼死誰
那麼何謂雙重指標呢? 其實就是多一顆星啦
一樣直接以例子來介紹搭上圖來消化應該會比較好了解?

void f(int a,int *pa,int *pb, int *pb,int **ppa, int **ppb){
    int b=0;
    b=*pa;
    *pb = **ppb+b+a;
    *ppa = pb; pb=pa; pa=*ppb;
    *pa = **ppb+b;
}
int main(){
    int a=2,b=3,c=4;
    int *pa=&a,*pb=&b;
    f(c,pa,&c,&pa,&pb);
}

這邊我們拆成兩部分來理解
第一部分是將main body的變數都設定好後
根據條件傳遞給function f
這邊可以看到function f中出現了雙重指標,因此在main body時傳入的變數是指標的記憶體位址

及為**ppa = &pa, **b = &pb

https://ithelp.ithome.com.tw/upload/images/20220922/20152495F2wpxdGLty.jpg
再來呢就是有點小麻煩的地方了
可以看到分為五個step

  1. *pb = **ppb + b + a
  2. ppa = pb 這邊可以看到 所謂的ppa 其實就是*pa所指向的記憶體位址
  3. pb = pa
  4. pa = ppb 而這邊因為 pa為指標 因此賦予位址的方式是以ppb
  5. *pa = **ppb + b

https://ithelp.ithome.com.tw/upload/images/20220922/20152495bYyvrwZ3ZC.jpg


上一篇
[Day6]指標(Pointer)
下一篇
[Day8]指標3
系列文
環島C一下自己的人生24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言