文档章节

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

丿咖啡灬微凉
 丿咖啡灬微凉
发布于 2017/04/17 23:52
字数 770
阅读 1
收藏 0

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

#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








本文转载自:http://blog.csdn.net/hjf161105/article/details/69398371

丿咖啡灬微凉
粉丝 1
博文 70
码字总数 0
作品 0
私信 提问
C# vs C++之二:GC vs RAII

C# vs C++之二:GC vs RAII 资源管理 C中资源管理极为繁琐易错,大多复杂C系统都面临内存泄露、悬挂指针等问题 一方面由底层语言特点决定;另一方面也由于C语言特性相对较少,严重依赖程序员...

ddatsh
2011/06/28
1K
6
C++ Primer 学习笔记(第三章:字符串、向量和数组)

C++ Primer 学习笔记(第三章:字符串、向量和数组) [TOC] 3.1 命名空间的声明 声明语句可以一行放多条。 位于头文件的代码,一般来说不应该使用声明。因为其内容会拷贝到每个使用该头文件的...

ShawnLue
2015/08/20
0
0
C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

C++强制类型转换:staticcast、dynamiccast、constcast、reinterpretcast 1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换...

shzwork
03/12
0
0
C++ 智能指针

智能指针(Smart Pointer),是一个来用存储指向动态分配(堆)对象指针的类。简单的说,它本身是一个类,这个类是用来存储对象指针。 一、智能指针的介绍 智能指针,就是具备指针功能同时提...

长平狐
2013/01/06
756
0
这一天,我用 Rust 重写了已有 19 年历史的 C++ 库!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csdnnews/article/details/84948881 从版本 56 开始,Firefox 浏览器支持一种新的字符编码转换库,叫做 enco...

CSDN资讯
2018/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?

轻松筹首创了“大病救助”模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题。而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后,是日益增长的各种数...

阿里云云栖社区
27分钟前
4
0
Confluence 6 在升级过程中查看合并日志

为了监控升级的过程,你应该查看 application log 日志中的输出。 通常日志经常将会显示多个日志实例,这个实例是定义在日志的 INFO 级别的,通常格式如下: WikiToXhtmlMigrationThread-n -...

honeymoose
27分钟前
3
0
git diff 文件对比

git diff filepath 工作区与暂存区比较 git diff HEAD filepath 工作区与HEAD ( 当前工作分支) 比较 git diff --staged 或 --cached filepath 暂存区与HEAD比较 git diff branchName filepa......

李佳顺
27分钟前
1
0
spring mvc 定制化配置

spring mvc 自定义配置 1.实现某些接口,然后让上面的类加载进去. class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean......

最爱肉肉
30分钟前
2
0
OSG_采样像机的内容如果不显示到窗口上

cameraLight->setRenderTargetImplementation(Camera::FRAME_BUFFER_OBJECT);// 这句使内容不渲染到屏幕上cameraLight->setRenderOrder(Camera::PRE_RENDER); 1.setRenderTargetImplement......

洛克人杰洛
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部