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

Bertha 。 2022-06-18 11:53 271阅读 0赞

一、找错——内存访问违规

  1. #include <iostream> using namespace std; int main() { char a; char *str1 = &a; char *str2 = "AAA"; strcpy(str1, "hello"); cout<<str1<<endl; str2[0] = 'B'; cout<<str2<<endl; return 0; }

第11行将一个字符串拷贝到一个字符中,内存不够,程序崩溃。

第13行,str2指向“AAA”这个字符串常量,所以对常量更改不合法,程序崩溃。

二、指针的隐式转换

找出错误

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int ival = 1024;
  5. int ival2 = 2048;
  6. int *pi1 = &ival;
  7. int *pi2 = &ival2;
  8. int **pi3 = 0;
  9. ival = *pi3;
  10. *pi2 = *pi3;
  11. ival = pi2;
  12. pi2 = *pi1;
  13. pi1 = *pi3;
  14. ival = *pi1;
  15. pi1 = ival;
  16. pi3 = &pi2;
  17. return 0;
  18. }

第11行编译错误,pi3是一个二级指针,*pi3是一级指针,ival是int型数据,不能隐式转换。
第12行编译错误,*pi2就是ival2,错误原因同上。

第13行编译错误,pi2是一个指针,ival是int型数据,不能隐式转换。

第14行编译错误,pi2是一个指针,*pi1就是ival,不能隐式转换。

第15行运行错误,pi3是NULL指针,*pi3会使程序崩溃。

第17行编译错误,pi1是一个指针,ival是int型数据,不能隐式转换。

三、指针常量和常量指针的区别

常量指针就是指向常量的指针,它所指向的内容是不可修改的。

指针常量就是指针的常量,他是不可改变的指针,但可以对它指向的内容修改。

四、指针的区别

下列四个指针有什么区别:

  1. char *const p1;
  2. char const *p2;
  3. const char* p3;
  4. const char * const p4;

第一个为指针常量,本身不可更改,指向内容可以更改。

第二个和第三个为常量指针,本身可以更改,指向内容不可更改。

第四个本身是常量,指向的内容也不能更改。

五、找错——常量指针和指针常量的作用

  1. #include <stdio.h>
  2. int main()
  3. {
  4. const char* node1 = "abc";
  5. char* const node2 = "abc";
  6. node1[2] = 'k';
  7. *node1[2] = 'k';
  8. *node1 = "xyz";
  9. node1 = "xyz";
  10. node2[2] = 'k';
  11. *node2[2] = 'k';
  12. *node2 = "xyz";
  13. node2 = "xyz";
  14. return 0;
  15. }

代码中,node1是常量指针,node2是指针常量,所以对node1的值进行更改的操作都是错误的,第8、9、10编译错误。对node2指针地址的更改操作也都是错的,所以第14、16行编译错误,第13、15运行错误。

六、this指针的叙述

下列关于this指针的叙述中,正确的是()

A. 任何与类相关的函数都有this指针。

B. 类的成员函数都有this指针。

C. 类的友元函数都有this指针。

D. 类的非静态成员才有this指针。

A错误,类的非静态成员函数属于类的对象,含有this指针,类的static函数属于类本身,不含有this指针。

B错误,理由同上。

C错误,友元函数是非成员函数,无法使用this指针。

D正确

七、this指针的使用

  1. #include <iostream>
  2. using namespace std;
  3. class MyClass
  4. {
  5. public:
  6. int m_data;
  7. MyClass(int data)
  8. {
  9. this->m_data = data;
  10. }
  11. void print()
  12. {
  13. cout<<"m_data = "<<m_data<<endl;
  14. }
  15. };
  16. int main()
  17. {
  18. MyClass *PMC;
  19. PMC = new MyClass(21);
  20. PMC->print();
  21. return 0;
  22. }

输出:

  1. m_data = 21

发表评论

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

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

相关阅读

    相关 C++指针引用

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

    相关 指针引用

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

    相关 引用指针区别

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

    相关 指针引用

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