iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
自我挑戰組

少年DevOps的C++奇怪漂流系列 第 29

Day29

在64位元系統指標是64/8 = 8bytes,而double也是8bytes若指標指向更小的型態如int就不合算了,相反的指向物件就很適合,但因為指標與傳值不同,指標會修改到被指向的目標,如果想避免修改到目標可以使用常數指標(const *Ptr)。
與C不同C++除了傳值與傳址還有一個傳參考(pass by reference),在傳址中我們常見到一個符號&其目的是取出記憶體位置,另外參考只是一個別名(allies)而已,怎麼說呢?以下兩個swap範例中我們會發現參考(reference)並沒有自己的記憶體位置而是直接使用傳進來的變數的記憶體位置,相反的指標版本的swap多出了2個記憶體位置。

  • SWAP 傳參考
#include <stdio.h>
#include <stdlib.h>

void swap(int &x, int &y) {
    printf("x,y記憶體位置:%p,%p\n", &x, &y);
    int tmp = x;
    x = y;
    y = tmp;
}

int main(){
    
    int a = 3;
    int b = 5;

    printf("a:%d,b:%d\n", a, b);
    printf("a,b記憶體位置:%p,%p\n", &a, &b);
    swap(a, b);
    printf("a:%d,b:%d\n", a, b);
    return 1;
}
//result
a:3,b:5
a,b記憶體位置:0x7fffffffdb10, 0x7fffffffdb14
x,y記憶體位置:0x7fffffffdb10, 0x7fffffffdb14
a:5,b:3
  • SWAP 傳指標
#include <stdio.h>
#include <stdlib.h>

void swap(int *x, int *y) {

    printf("x,y記憶體位置:%p,%p\n", &x, &y);
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

int main(){
    
    int a = 3;
    int b = 5;

    printf("a:%d,b:%d\n", a, b);
    printf("a,b記憶體位置:%p,%p\n", &a, &b);
    swap(&a, &b);
    printf("a:%d,b:%d\n", a, b);

    return 1;
}
//result
a:3,b:5
a,b記憶體位置:0x7fffffffdb20, 0x7fffffffdb24
x,y記憶體位置:0x7fffffffdaf8, 0x7fffffffdaf0
a:5,b:3

上一篇
Day28:錯誤處理
下一篇
Day30: auto_ptr
系列文
少年DevOps的C++奇怪漂流30

尚未有邦友留言

立即登入留言