#include "iostream" using namespace std; #include "assert.h" void Swap(int *ap,int *bp) { ?? ?assert(ap == NULL || bp == NULL);//判断指针是否为空 ?? ?int tmp = *ap; ?? ?*ap = *bp; ?? ?*bp = tmp; } int *funa() { ?? ?int a = 10;
?? ?return &a;//错误,函数结束,空间释放了,下一个函数可使用该空间,所以不可返回引用或指针,若生存期不受函数影响则可以 } int main() { ?? ?/*char ch; ?? ?int a; ?? ?double x; ?? ??? ?char str[20]; ?? ??? ?cin >> ch >> a >> x >> str; ?? ??? ?cout << ch << "\t" << a << "\t" << x << str << endl; ?? ??? ?return 0;*/
?? ?int a = 10, b = 20; ?? ?int* const p = &a;//*p=100,p=&b; ?? ?int* s1 = p; ?? ?const int* s2 = p; ?? ?int* const s3 = p; ?? ?const int* const s4 = p;
?? ?cout << *s4<< endl; ?? ?return 0; ?? ?可以取地址 左值 ?? ?不可以取地址 右值
?? ?int a = 10; ?? ?int b = a;//左值引用,可以取地址? ?? ?int& c = a;//&c是a的别名,引用//&c为a的地址,用地址来引用a ?? ?int& d = c; ?? ?int&& x = 10;//不是引用的引用,右值引用,不可以取地址? ?? ?x += 10; ?? ?a += 10; ?? ?cout << c <<'\t' << d << '\t' << &c << '\t' << &d << '\t' << x << '\t' << &x << endl; ?? ?int a = 10; ?? ?int* p = &a; ?? ?int* p; p = &a; ?? ?int& c = *p; ?? ?cout << p << '\t' << *p << '\t' << c << '\t' << &c << '\t' << &a<<endl;
?? ?引用必须初始化,没有空引用 ?? ?int a = 10; ?? ?const int b = 20; ?? ?int &x = a; ?? ?const int &y = a;//常引用不可修改 ?? ?int const &m = a; ?? ?int c = y; ?? ?y += 10;错 ?? ?常量必须使用常引用 ?? ?普通变量二者都可以 ?? ?int&& x = 10; ?? ?int x = 10; ?? ?/*int x = 10, y = 20; ?? ?Swap(&x, &y); ?? ?cout << x << y << endl;*/ ?? ?int ar[5] = { 1,2,3,4,5 }; ?? ?int* p = &ar[0];//int *p=ar; ?? ?int*& s = p;//指针引用//s是地址=ar,&s是地址的地址,*&s=ar ?? ?int& x = ar[0];//&x=ar ?? ?int(&br)[5] = ar;//数组的引用,引用数组必须两个属性,长度,数组名,引用的是整个数组 ?? ?int* q = ar; ?? ?int(*m)[5] = &ar;//数组指针?? ??? ?sizeof(m)?? ?4?? ?unsigned int ??? ??? ?sizeof(br)?? ?20?? ?unsigned int ?? ??? ?sizeof(*m)?? ?20?? ?unsigned int ?? ??? ??? ?*m?? ?0x00effb44 {1, 2, 3, 4, 5}?? ?int[5] ? ?? ??? ?m?? ?0x00effb44 {1, 2, 3, 4, 5}?? ?int[5] * ?? ? ??? ?ar?? ?0x00effb44 {1, 2, 3, 4, 5}?? ?int[5] ? ? ? ??? ??? ?br?? ?0x00effb44 {1, 2, 3, 4, 5}?? ?int[5] & ?? ?int(*m)[5] ? (*m)[5]=&ar ?? ?int ar[5] = { 1,2,3,4,5 }; ?? ?int * ip = ar; ?? ?int& c = ar[0]; ?? ?++ip;//地址+1 ar+1 ?ar=1,2,3,4,5 ? *ip=2 ?? ?++c;//0下标加1 ar=2,2,3,4,5 ? c=2 ?会改变实体值 ?? ?int * ip = NULL; ?? ?ip = funa(); ?? ?cout << *ip << endl;//错误,失效指针
}
?? ? ?
|