您的位置:首页 > 编程语言 > C语言/C++

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

2017-04-06 20:13 218 查看

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

#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”这个字符串常量,所以对常量更改不合法,程序崩溃。

二、指针的隐式转换

找出错误
#include <stdio.h>

int main()
{
int ival = 1024;
int ival2 = 2048;
int *pi1 = &ival;
int *pi2 = &ival2;
int **pi3 = 0;

ival = *pi3;
*pi2 = *pi3;
ival = pi2;
pi2 = *pi1;
pi1 = *pi3;
ival = *pi1;
pi1 = ival;
pi3 = &pi2;

return 0;
}
第11行编译错误,pi3是一个二级指针,*pi3是一级指针,ival是int型数据,不能隐式转换。

第12行编译错误,*pi2就是ival2,错误原因同上。
第13行编译错误,pi2是一个指针,ival是int型数据,不能隐式转换。
第14行编译错误,pi2是一个指针,*pi1就是ival,不能隐式转换。
第15行运行错误,pi3是NULL指针,*pi3会使程序崩溃。
第17行编译错误,pi1是一个指针,ival是int型数据,不能隐式转换。

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

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

四、指针的区别

下列四个指针有什么区别:
char *const p1;
char const *p2;
const char* p3;
const char * const p4;


第一个为指针常量,本身不可更改,指向内容可以更改。
第二个和第三个为常量指针,本身可以更改,指向内容不可更改。
第四个本身是常量,指向的内容也不能更改。

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

#include <stdio.h>

int main()
{
const char* node1 = "abc";
char* const node2 = "abc";

node1[2] = 'k';
*node1[2] = 'k';
*node1 = "xyz";
node1 = "xyz";

node2[2] = 'k';
*node2[2] = 'k';
*node2 = "xyz";
node2 = "xyz";

return 0;
}


代码中,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指针的使用

#include <iostream>

using namespace std;

class MyClass
{
public:
int m_data;
MyClass(int data)
{
this->m_data = data;
}
void print()
{
cout<<"m_data = "<<m_data<<endl;
}
};

int main()
{
MyClass *PMC;
PMC = new MyClass(21);
PMC->print();

return 0;
}


输出:
m_data = 21
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: