IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言之数据类型相应转换问题 -> 正文阅读

[C++知识库]c语言之数据类型相应转换问题

之前在做单链表设计的时候,涉及到了一个复合数据类型转换问题。

简单的数据类型转换当然是没有什么问题的,只是这里涉及到了复合数据类型,一旦出现相应内存不匹配问题,就会出现相应地址访问失败的情况。

先来看相应的数据结点类型:

上面就是做单链表的时候,设计一个数据结点和一个头结点,头结点里面嵌套了一个数据结点,目的是为了从头结点方便移动,毕竟第一个结点是指向数据结点。

上面两个结点虽然命名不一样,但是内存结构都是一样的,先来看一下内存图

上面两者数据类型一致,因此直接做了相应的转换,就可以进行访问 。注意这里我说了数据类型一致,才能进行访问。当然了,如果在内存当中,数据类型不一致,你也可以选择强转,但是访问可能会出错,如果是数据类型不一致的情况下。

?下面我们先来看一下数据类型一致的情况下,数据的访问

test.cpp

#include <stdio.h>
#include <stdlib.h>

struct node {
	int value;
	node *next;
};

void main()
{
	//分配几个结点数据
	node node1 = { 1, NULL };
	node node2 = { 2, &node1 };
	node node3 = { 3, &node2 };
	
	//用一个pnode结点指向了node3这个结点
	node *pnode = &node3;//这个是数据类型是匹配的,没问题
	//然后开始遍历也没有问题
	for (; pnode != NULL;pnode = pnode->next) {
		printf("%d ", pnode->value);
	}
	printf("\n-----\n");

	system("pause");
}

运行结果:

?在来看一个数据类型一致的情况

#include <stdio.h>
#include <stdlib.h>

struct node {
	int value;
	node *next;
};

struct t_node{
	int length;
	node *firstNode;
};


void main()
{
	//分配几个结点数据
	node node1 = { 1, NULL };
	node node2 = { 2, &node1 };
	node node3 = { 3, &node2 };
	
	//先分配一个头结点
	t_node t_node1 = {3,&node3};
	//然后用一个node类型的结点指向头结点
	//这里做了一个数据类型转换
	//然后利用pnode1进行了一个打印访问
	node *pnode1 = (node*)&t_node1;
	for (; pnode1 != NULL; pnode1 = pnode1->next) {
		printf("%d ", pnode1->value);
	}

	system("pause");
}

运行结果:

这样也可以打印,先来看一下两个不同结点类型的内存结构

?

上面内存中数据类型一致,所以可以直接转换,然后打印。

?那么如果我们把上面代码变成如下代码呢

#include <stdio.h>
#include <stdlib.h>

struct node {
	int value;
	node *next;
};

struct t_node{
	node *firstNode;
	int length;
};


void main()
{
	//分配几个结点数据
	node node1 = { 1, NULL };
	node node2 = { 2, &node1 };
	node node3 = { 3, &node2 };
	
	//先分配一个头结点
	t_node t_node1 = {&node3,3};
	//然后用一个node类型的结点指向头结点
	//这里做了一个数据类型转换
	//然后利用pnode1进行了一个打印访问
	node *pnode1 = (node*)&t_node1;
	for (; pnode1 != NULL; pnode1 = pnode1->next) {
		printf("%d ", pnode1->value);
	}

	system("pause");
}

运行结果:

上面很明显就是发生了内存地址访问冲突,那么为什么会出现这种情况?我们去看一下两个不同结点的内存结构

?很明显t_node转换成node之后,内存结构不匹配,所以不能进行直接访问。

那么如果我们才把上面的代码改变一下

#include <stdio.h>
#include <stdlib.h>

struct node {
	int value;
	node *next;
};

struct t_node{
	int length;
	node *firstNode;
	int v1;
	int *pv;
};


void main()
{
	//分配几个结点数据
	node node1 = { 1, NULL };
	node node2 = { 2, &node1 };
	node node3 = { 3, &node2 };
	
	//先分配一个头结点
	t_node t_node1 = {3,&node3,4,NULL};
	//然后用一个node类型的结点指向头结点
	//这里做了一个数据类型转换
	//然后利用pnode1进行了一个打印访问
	node *pnode1 = (node*)&t_node1;
	for (; pnode1 != NULL; pnode1 = pnode1->next) {
		printf("%d ", pnode1->value);
	}

	system("pause");
}

?运行结果:

还是可以访问到,再来看一下两个结点数据类型的内存结构

?

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:33  更:2022-10-31 11:37:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:23:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码