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++知识库]C++和C语言区别(二)附二级指针的动态内存申请

结构体区别

1.定义结构体与C语言一致

2.定义变量可省略关键字struct

3.C++结构体中允许函数存在(C++在没有写构造函数和权限限定的时候,用法和C语言一致)

(1)函数可以直接在结构体中实现,也可在结构体中声明,在结构体外实现,

(2)结构体中函数可以直接访问结构体中数据

(3)学会调用:

? ? ? ? ?对象(结构体变量).成员

? ? ? ? ?对象指针->成员

? ? ? ? ?(*对象指针).成员

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

struct MM
{
	//属性,特性    数据成员
	char name[20];
	int age;
	void print()//行为方法      成员函数
	{
		cout << name << "\t" << age << endl;
	}
	void printData();//结构体中声明
	int& putage()
	{
		return age;
	}
};

void MM::printData()//在结构体外实现
{
	cout << name << "\t" << age << endl;
}

//结构体中的变量必须要通过结构体变量(结构体指针)访问
//C++结构体中的函数可以直接访问属性
int main()
{
	MM a = {"tatata",21};//等效于struct MM a;
	a.print();
	(&a)->printData();
	MM* p = &a;
	p->printData();
	p->putage() = 22;
	p->printData();
	p->age = 23;
	p->print();
    MM arr[3];
	return 0;
}

动态内存申请

1.C语言的动态内存申请

(1)malloc 不带初始化,calloc 带初始化的,realloc 重新申请,free 释放

2.C++的动态内存申请

(1)new 申请,delete 释放

(2)单个动态内存申请

(3)数组动态内存申请

(4)结构体动态内存申请

#include <iostream>
#include <cstring>
using namespace std;

void testonememory()
{
	//申请不做初始化
	int* pint = new int;
	*pint = 123;
	cout << *pint << endl;
	//申请并做初始化   ()给单个数据初始化
	char* pchar = new char('a');
	cout << *pchar << endl;
	delete pint;
	pint = nullptr;
	delete pchar;
	pchar = nullptr;
}

void testarraymemory()
{
	//一维数组不带初始化   长度可以是变量
	int* pint = new int[3];//等效产生了int pint[3]数组
	char* pchar = new char[20];
    //pchar="Iloveyou";只是改变了指针的指向,并没有初始化指针指向的内存段
	strcpy(pchar, "Iloveyou");
	cout << pchar << endl;
	delete[] pint;//数组的释放
	pint = nullptr;
	delete[] pchar;
	pchar = nullptr;
	//带初始化的一维数组   用{}
	int* pInt = new int[3]{1, 2, 3};
	for (int i = 0; i < 3; i++)
	{
		cout << pInt[i] << " ";
	}
	cout << endl;
	delete[] pInt;//指针再次使用
	pInt = nullptr;
}
struct MM
{
	char* name;
	int age;
	void print()
	{
		cout << name << "\t" << age << endl;
	}
};
void teststructmemory()
{
	//new 一个对象   结构体初始化只能用{}
	MM* pstruct = new MM;
	//结构体指针中,要做二次申请,才能进行赋值和strcpy
	pstruct->name = new char[20];
	strcpy(pstruct->name, "丽丝");
	pstruct->age = 21;
	pstruct->print();
	delete[] pstruct->name;
	pstruct->name = nullptr;
	delete pstruct;
	pstruct = nullptr;
}
int main()
{
	testonememory();
	testarraymemory();
	teststructmemory();
	return 0;
}

内存池

1.malloc 内存是在堆区,new内存是自由存储区

#include <iostream>
using namespace std;

void testmemory()
{
	char* memorySum = new char[1024];
	int* pNum= new(memorySum) int[3]{1, 2, 3};
	//char* pstr = new(pNum + 3) char[20]{"Iloveyou"};//等效下面这句话
	char* pstr = new(memorySum + 12) char[20];
	strcpy(pstr, "Iloveyou");
	for (int i = 0; i < 3; i++)
	{
		cout << pNum[i] << " ";
	}
	cout << endl << pstr << endl;
	delete[] memorySum;
	memorySum = nullptr;
}
int main()
{
	testmemory();
	return 0;
}

string类型

1.string创建

(1)带初始化和不带初始化

(2)通过另一个函数创建

#include <iostream>
#include <string>
using namespace std;

void createstring()
{
	std::string str1;//未用using 语法省略
	str1 = "Iloveyou";
	cout << str1 << endl;
	string str2 = "Iloveyou";
	cout << str2 << endl;
	string str3("Iloveyou");
	cout << str3 << endl;
	string str4(str3);
	cout << str4 << endl;
	string str5 = str4;
	cout << str5 << endl;
}

2.string基本操作

(1)拷贝

(2)赋值

(3)链接

(4)比较

#include <iostream>
#include <string>
using namespace std;

void operatorString()
{
	string str1 = "Ilove";//赋值
	string str2 = "You";
	string str3 = str2;//拷贝
	cout << str3 << endl;
	string str4 = str1 + str3;//连接
	cout << str4 << endl;
	if (str1 > str3)//比较
	{
		cout << str1 << "大" << endl;
	}
	else
	{
		cout << str3 << "大" << endl;
	}
}

3.C++string与C语音string.h

(1)C++中是一个自定义类型(类)

(2)C++中的string不能用到C语言的字符串处理函数

(3)C++转换为C语言中的char*:c_str()? ? ?data()? ?

(4)直接把数字转为相应的字符串

#include <iostream>
#include <string>
using namespace std;
#include <cstring>

void compareCandCpp()
{
	string str1 = "Iloveyou";
	printf("%s\n", str1.c_str());
	printf("%s\n", str1.data());
	
	string str2 = to_string(1234);
	cout << str2 << endl;
}

注:empty()? ? ? ? ? size()

二位数组的动态内存申请

#include <iostream>
#include <assert.h>
using namespace std;
int** createArray2(int row, int cols);//声明

int main()
{
	int** p =createArray2(5, 5);
	for (int i = 0; i < 5; i++)//内存检测
	{
		for (int j = 0; j < 5; j++)
		{
			p[i][j] = i*j;
			cout << p[i][j] << "\t";
		}
		cout << endl;
	}
	return 0;
}

int** createArray2(int row, int cols)
{
	int** PArray = new int*[row];//二级指针动态申请
	assert(PArray);//断言保护
	for (int i = 0; i < row; i++)
	{
		PArray[i] = new int[cols];//一级指针动态申请
		assert(PArray[i]);
	}
	return PArray;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:34:54  更:2021-11-17 12:35:37 
 
开发: 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/24 6:57:58-

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