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