C++的指针和地址。
指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是另一个变量或常量的地址。
什么是指针。
- 指针可以看作是JOJO里的替身,替身使者+独有技能。
- & 是取出某变量的地址。指针就是来表示一个变量的值和地址。
int *ptr = &icount;
- 对ptr 输出得到的是icount的地址,对*ptr输出得到的是icount的值。
- 指针作为变量也有自己的地址。比如&ptr,输出就会得到指针地址的位置。
怎样创建指针。
1
2
3
4
5
6
int icount = 18;
int *ptr = &icount;
int *ptr = null;
int x = 8848;
ptr = &x;
使用样例
- Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
int main() { int icount = 18; int* ptr = &icount; cout << "ptr = " << ptr << endl; cout << "*ptr = " << *ptr << endl; cout << "&ptr = " << &ptr << endl; cout << "&icount = " << &icount << endl; *ptr = 58; puts("*ptr = 58; --------------------"); cout << "icount = " << icount << endl; //cout << "*icount = " << *icount << endl; cout << "&icount = " << &icount << endl; cout << "ptr = " << ptr << endl; cout << "*ptr = " << *ptr << endl; cout << "&ptr = " << &ptr << endl; icount = 111100; puts("icount = 111100; ----------------"); cout << "icount = " << icount << endl; //cout << "*icount = " << *icount << endl; cout << "&icount = " << &icount << endl; cout << "ptr = " << ptr << endl; cout << "*ptr = " << *ptr << endl; cout << "&ptr = " << &ptr << endl; int x = 8848; ptr = &x; cout << "ptr = " << ptr << endl; cout << "*ptr = " << *ptr << endl; cout << "&ptr = " << &ptr << endl; }
- Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ptr = 0093F944 *ptr = 18 &ptr = 0093F938 &icount = 0093F944 *ptr = 58; -------------------- icount = 58 &icount = 0093F944 ptr = 0093F944 *ptr = 58 &ptr = 0093F938 icount = 111100; ---------------- icount = 111100 &icount = 0093F944 ptr = 0093F944 *ptr = 111100 &ptr = 0093F938 ptr = 0093F92C *ptr = 8848 &ptr = 0093F938
函数中指针的使用。
函数中有三种参数传递方式。
- 值传递。
1 2 3 4 5 6 7 8 9 10 11 12
void swap(int a, int b) { int t= a; a=b; b=t; } int main() { int a =1; int b =2; swap(a,b); }
以上不会发生a,b值替换。传进去的a和b是形参,a和b的地址与函数被调用时传入实参的地址不一样所以无法发生值替换。 简单来说,形参a,b仅仅和调用时传入的实参值一样,其它所有特性完全独立,无法替代传入的实参。
- 地址传递。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
int swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; return temp; } int main() { int a = 1, b = 2; int *p1 = &a; int *p2 = &b; swap(p1, p2); //swap(&a,&b); }
此时的指针 x y 指向 a, b 地址。*x 和 *y 就可以直接对 a, b 地址上对应的值进行操作。
- 引用传递
1 2 3 4 5 6 7 8 9 10 11
void swap(int &x, int &y) { int t = x; x = y; y = t; } int main() { int a = 3, b = 4; swap(a, b); }
此时直接传入的就是 a, b的地址, x, y值和地址都跟 a, b 一样,基本就可以看作 a, b 换了个 x, y 的名字。
多重引用。
待更新。。。