- 引用的注意事項
// 引用注意事項, 不能返回局部變量的引用
int & test3() { //因為局部變量出了函數體外 就會被銷毀int a = 10;return a;
}// 引用注意事項, 返回值如果是引用, 那么函數可以作為左值進行運算
int & test4() {static int a = 100;return a;
}
int main()
{ test4() = 300;cout << test4() << endl; // 輸出300return 0;
}
- 指針的使用
struct Person {int age;int id;string name;
};void allocSpace(Person **p) { // Person **p = &per;*p = (Person *)malloc(sizeof(Person)); // *p 就是 per這個 指針變量, 指向了(就是存儲了對象的堆內存地址) Person結構體對象內存(*p)->age = 10;(*p)->id = 1;
}
int main()
{ Person *per = NULL; // 這時候 per 是一個指針變量(可以指向Person結構體的指針變量)allocSpace(&per); // 對這個 per 指針變量取地址運算&, allocSpace函數形參是為 Person數據類型的 二級指針cout << per->age << endl;cout << per->id << endl;free(per);return 0;
}
// 這里考慮為什么函數參數用二級指針, 這和交換變量的內容時的原理是一樣的。
// int a=3;b=5; 用函數交換ab的值,需要傳遞ab的地址,同理這里Person *per = NULL; 如果讓per能關聯到allocSpace分配的堆內存,也需要將per這個指針變量的 地址傳遞進去,所以就用到了二級指針.
- 重點來了,指針的引用,如下代碼:
struct Person {int age;int id;string name;
};
void allocSpace2(Person* &p) { // Person* &p = per; 本質上為 Person** const p = &per;p = (Person *)malloc(sizeof(Person)); // p本身存放的實際內容其實是per這個指針變量所在的內存地址, 因為p是引用類型所以編譯給我們優化了p->age = 23;p->id = 2;
}void test6() {Person *per = NULL;allocSpace2(per);cout << per->age << endl;cout << per->id << endl;free(per);
}
int main()
{ test6();return 0;
}
- 引用的本質
{// 引用的本質int a = 3;int &p = a; // 其本質就是 int* const p = &a;p = 5; // 其本質就是 *p = 5;
}