c/c++整理--引用和指针(1)

r囧r小猫 2022-06-18 07:39 252阅读 0赞

一、一般变量引用

看代码写输出

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 10;
  6. int b = 20;
  7. int &rn = a;
  8. int equal;
  9. rn = b;
  10. cout<<"a = "<<a<<endl;
  11. cout<<"b = "<<b<<endl;
  12. rn = 100;
  13. cout<<"a = "<<a<<endl;
  14. cout<<"b = "<<b<<endl;
  15. equal = (&a == &rn) ? 1 : 0;
  16. cout<<"equal = "<<equal<<endl;
  17. return 0;
  18. }

第九行说明rn为a的引用,所以,rn发生改变a也会随之改变。

第十二行将b赋给rn,a的值也改为b的值,所以13、14行的输出都是20.

第16行rn赋100,a的值也为100,b的值不变,17、18行输出100,20。

第22行输出1,两者实质是共用同一个内存空间。

答案:

  1. a = 20
  2. b = 20
  3. a = 100
  4. b = 20
  5. equal = 1

二、指针变量引用

看代码写输出

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 1;
  6. int b = 10;
  7. int* p = &a;
  8. int* &pa = p;
  9. (*pa)++;
  10. cout<<"a = "<<a<<endl;
  11. cout<<"b = "<<b<<endl;
  12. cout<<"*p = "<<*p<<endl;
  13. pa = &b;
  14. (*pa)++;
  15. cout<<"a = "<<a<<endl;
  16. cout<<"b = "<<b<<endl;
  17. cout<<"*p = "<<*p<<endl;
  18. return 0;
  19. }

第9行中将a的地址赋给指针p,第10行中将p引用为pa,所以在下面的程序中,pa和p代表同一个指针。

12行pa的值自加,pa指向的值就是a,a++后为2,13行输出2,14行输出10,15行输出2,

17行将b的地址赋给pa,取pa值自加,19行输出之前的a值2,20行输出自加后的b值11,21行输出11。

答案

  1. a = 2
  2. b = 10
  3. *p = 2
  4. a = 2
  5. b = 11
  6. *p = 11

三、找错——变量引用

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 1, b = 2;
  6. int &c;
  7. int &d = a;
  8. &d = b;
  9. int *p;
  10. *p = 5;
  11. return 0;
  12. }

这里要说明一下,引用的声明必须要进行初始化,&符号只有在初始化声明的时候才代表引用,其他时候代表的都是取地址的意思。

这里第8行声明引用的时候没有初始化错误,第10行&d=b有歧义,&不再代表引用,编译出错,第13行将p的内容赋5,p未初始化,此时的p为野指针,程序会运行崩溃。

四、如何交换两个字符串

  1. #include <iostream>
  2. using namespace std;
  3. void swap(char* &a, char* &b)
  4. {
  5. char *temp;
  6. temp = a;
  7. a = b;
  8. b = temp;
  9. }
  10. int main()
  11. {
  12. char *ap = "hello";
  13. char *bp = "how are you?";
  14. cout<<"ap:"<<ap<<endl;
  15. cout<<"bp:"<<bp<<endl;
  16. swap(ap, bp);
  17. cout<<"ap:"<<ap<<endl;
  18. cout<<"bp:"<<bp<<endl;
  19. return 0;
  20. }

这里swap函数是利用指针引用来实现字符串的交换的,如果不用引用,交换只会在函数中有效,函数结束后无效。

结果:

  1. ap:hello
  2. bp:how are you?
  3. ap:how are you?
  4. bp:hello

不用引用,还可以用二级指针实现

  1. void swap(char **a, char**b)
  2. {
  3. char* temp;
  4. temp = *a;
  5. *a = *b;
  6. *b = temp;
  7. }

五、改错——参数引用

  1. #include <iostream>
  2. using namespace std;
  3. const float pi = 3.14f;
  4. float f;
  5. float f1(float r)
  6. {
  7. f = r*r*pi;
  8. return f;
  9. }
  10. float& f2(float r)
  11. {
  12. f = r*r*pi;
  13. return f;
  14. }
  15. int main()
  16. {
  17. float a = f1(5);
  18. float& b = f1(5);
  19. float c = f2(5);
  20. float& d = f2(5);
  21. d += 1.0f;
  22. cout<<"a = "<<a<<endl;
  23. cout<<"b = "<<b<<endl;
  24. cout<<"c = "<<c<<endl;
  25. cout<<"d = "<<d<<endl;
  26. cout<<"f = "<<f<<endl;
  27. return 0;
  28. }

f1函数返回的是全局变量f的值,f2函数返回的是全局变量f的引用。

第22行,正确,将变量a赋为f1的返回值,

第23行,错误,在f1函数里,全局变量的值赋给一个临时变量temp,这个temp由编译器隐式建立,然后建立这个temp的引用b,这里对一个临时变量temp进行引用会发生错误。

第24行,正确,f2函数在返回值时并没有隐式的建立临时变量temp,而是直接将全局变量f返回主函数。

第25行,正确,主函数不使用定义变量,而是直接使用全局变量的引用。

第27行,正确,d此时为f的引用,d+=1.0,因此f变为79.5。

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++指针引用

    引用 是内存空间另外一个别名,相当于门牌号,可以用它来找到具体的内存空间。 int i = 17; int &b = i; cout << b

    相关 指针引用

    1.指针和引用的差别 (1)非空区别:任何情况下都不能使用指向空值的引用。一个引用总是指向某些对象。如果声明一个变量并让它指向一个对象,但是该变量某些时候可能也不指向任何对

    相关 引用指针区别

    将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对

    相关 指针引用

    1、引用 1. 引用必须初始化 引用就是给对象取一个别名。定义引用,程序把引用和它的初始值绑定在一起(绑定之后不可再绑定其他对象),而不是初始值拷贝引用,为