目录
一、结构体的区别
1.类型上不再需要struct关键字,直接用结构体名即可
#include<iostream>
using namespace std;
struct MM
{
char name[20];
int age;
char sex;
};
int main()
{
MM mm;//等同于struct MM mm;
while (1);
return 0;
}
2.C++结构体中允许函数存在
(1).在结构体中声明,在结构体外实现,当然也可以直接在结构体中实现 .
(2).结构体中函数访问数据,是可以直接访问 .
(3).调用方式和调用数据成员方式一样.
● 对象(结构体变量).成员
● 对象指针->成员
● (*对象指针).成员
(4).C++中在没有写构造函数和权限限定的时候,用法和C语言的用法是一样 .
#include<iostream>
using namespace std;
struct MM
{
//属性,特征
//数据成员
char name[20];
int age;
const char* sex;
//成员方法
void print()
{
cout << name << "\t" << age << "\t" << sex << endl;
}
void printData();
int& getAge()//引用作为函数返回值 通过外部函数修改数据
{
return age;
}
};
//结构体名限定,就是告诉别人这个函数来自哪里
void MM::printData(){
cout << name << "\t" << age << "\t" << sex << endl;
}
//结构体中的变量必须要通过结构体变量(结构体指针)访问
//C++结构体中的函数访问属性,可以直接访问
int main()
{
MM mm = { "小红", 18, "W" };//等同于struct MM mm;
MM mn = { "小丽", 20, "W" };
//函数调用
mm.print();
mn.printData();
mm.getAge() = 23;//此时mm.getAge()==age;
(&mm)->print();
//不同的调用方式
MM* pMM = &mm;
pMM->print();
pMM->getAge() = 25;
pMM->printData();
//结构体数组
MM array[3];
while (1);
return 0;
}
二、动态内存申请
1.C语言的动态内存申请 (复习一下)
malloc | 从堆中分配内存 |
calloc | 分配一个数组,并将其元素初始化为 0 (零) |
realloc | 将块重新分配到新大小 |
free | 释放 |
深入了解C语言动态内存分配,可点击链接,自行学习^^
2.C++的动态申请
new | 申请内存 |
delete | 释放 |
(1).单个变量内存申请
void testOneMemory(){
//不做初始化的申请
int* pInt = new int;
*pInt = 255;
cout << *pInt << endl;
char* pChar = new char;
*pChar = 'A';
cout << *pChar << endl;
//释放
delete(pInt);
pInt = nullptr;
delete(pChar);
pChar = nullptr;
//做初始化的申请
int* PInt=new int(123);
cout<<*PInt<<endl;
char* PChar=new char('B');
cout<<*PChar<<endl;
//释放内存(养成好习惯)
delete(PInt);
PInt=nullptr;
delete(PChar);
PChar = nullptr;
}
(2).数组的动态申请
void testArrayMemory()
{
//一维数组
//1.不带初始化
//长度可以是变量,只要值就可以
int* pInt = new int[3]; //等效产生了int pInt[3]的数组
char* pstr = new char[15];
strcpy_s(pstr, 15, "ILoveyou");
cout << pstr << endl;
//cout << pstr1 << endl;
//带初始化的 一堆数据用 {}
int* pNum = new int[3]{ 1,2,3 };
for (int i = 0; i < 3; i++)
{
cout << pNum[i] << " ";
}
cout << endl;
delete[] pNum;
char* str = new char[20]{ 'A','B','\0' };
cout << str << endl;
delete[] str;
str = nullptr;
str = new char[20]{ "ILoveyou" };
cout << str << endl;
delete[] str;
str = nullptr;
delete [] pInt; //数组的释放 不需要大小
//释放只有两种形式 delete 指针 delete [] 指针
//delete [][] p 没有这种写法
pInt = nullptr;
}
(3).结构体内存申请
struct MM
{
//属性,特征
//数据成员
char* name;
int age;
char* sex;
//成员方法
void print()
{
cout << name << "\t" << age << "\t" << sex << endl;
}
void printData();
int& getAge()//引用作为函数返回值 通过外部函数修改数据
{
return age;
}
};
void testStructMemory(){
MM* pMM = new MM;
//结构体中指针,要做二次申请,才能strcpy,或者赋值
pMM->name = new char[20];
strcpy_s(pMM->name, 20, "小杜");
pMM->age = 18;
pMM->sex = new char[10];
strcpy_s(pMM->sex, 10, "W");
pMM->print();
//申请顺序和释放顺序是相反
delete[] pMM->name;
delete pMM;
}
三、内存池
允许大家申请一段内存,共给程序使用,综合管理内存
void testMemory(){
char* Pmemory = new char[1024];
//.......事情的处理,需要内存,所有内存源自于memorySum
//int* pNum = new(申请内存的开始位置) int[3]
int* pNum = new(Pmemory) int[3]{1,2,3};
//char* pchar = new(pNum + 3) char[20]{"ILoveyou"};
char* pchar = new(Pmemory + 12) char[20];
strcpy_s(pchar, 20, "ILoveyou");
for (int i = 0; i < 3; i++)
{
cout << pNum[i] << " ";
}
cout << endl;
for (int i = 0; i < 3; i++)
{
cout << ((int *)Pmemory)[i] << " ";
}
cout << endl << pchar << endl;
cout << (Pmemory + 12) << endl;
delete[] Pmemory;
Pmemory = nullptr;
}
四、string类型
(只需要知道有这种用法即可,不需要大家深究为什么,因为string本身是一个类,需要讲完类的大部分知识,才能追究为什么这样做。自己也可以封装一个string 类型 )
1. string创建
#include <string> //注意和string.h区别
#include <iostream>
#include <cstring> //string.h和cstring是一样
#include <stdio.h>
using namespace std;
void creatString()
{
//std::string str;
string str1;
str1 = "ILoveyou"; //所以一般用string不会加const
cout << "First:" << str1 << endl;
const string cstr;
//cstr = "IMissyou"; 错误,常属性不能修改
string str2("ILoveyou");
cout << str2 << endl;
string str3 = "IMissyou"; //喜欢这种方式
cout << str3 << endl;
string str4(str3);
cout << str4 << endl;
string str5 = str4;
cout << str5 << endl;
//一般没有长度限定,在你使用范围下
}
int main()
{
creatString();
while (1);
return 0;
}
2.string基本操作
void operatorString()
{
string str1 = "one";
string str2 = "two";
string str3 = str2;
cout << str3 << endl;
//没有减法
string str4 = str1 + str2;
//等效: string str4=str1.append(str2);
//C++中尽量用string 不要用char* ,可以用
//比较直接比较即可
//> < != ==
//str1.compare(str2) 0 -1 1
if (str1 > str2) //比较依旧按照char* 去比较
{
cout <<"大的 "<< str1 << endl;
}
else
{
cout << "大的 " << str2 << endl;
}
}
3.C++string与C语言string.h
void compareCAndCpp()
{
//C++中是一个自定义类型(类),目前当作结构体即可
//C++string 不能用到C语言的字符串处理函数
//C++如何转换为C语言的char*
//c_str() data()函数
string str1 = "ILoveyou";
//printf("%s", str1);
printf("%s\n", str1.c_str());
printf("%s\n", str1.data());
//outtextxy(int x,int y,char* str);
//直接把数字转换为相应的字符串
string str2 = to_string(1234);
//atoi
cout << str2 << endl;
}
4.string 其他函数操作
basic_string 类 | Microsoft Docs(可通过此链接查看更多)
void exOperator()
{
//采用下表法打印string
string str = "IMissyou";
//C++string中没有记录\0
for (int i = 0; i < 8; i++)
{
cout << str[i];
}
cout << endl;
//其他函数操作
//万金油函数
//empty()
//size();
string mystring = "IMissyou";
//cout << sizeof(mystring) << endl; //28
//cout <<"容量:" <<mystring.capacity() << endl;
cout <<"mystring:"<< mystring.size() << endl;
string strEmpty;
if (strEmpty.empty()) //return length==0;
{
cout << "string为空" << endl;
}
}
*编程题:
1.二维数组的动态内存申请,采用子函数的方式 为二级指针申请内存,和释放内存
- C++版
#include<iostream>
#include<string>
using namespace std;
int** createArray2D(int row,int cols)
{
int** pArray = new int*[row];
for (int i = 0; i < row; i++)
{
pArray[i] = new int[cols];
}
return pArray;
}
int main()
{
int** p = createArray2D(2, 3);
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
p[i][j] = i * j;
cout << p[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < 2; i++)
{
delete[] p[i];
}
delete[] p;
p = nullptr;
while (1);
return 0;
}
- C语言版(直接CV^^)
#include <string.h> #include <stdio.h> #include <stdlib.h> int** createArray2D(int row, int cols) { //int *pArray=(int*)malloc(sizeof(int)*3) int** pArray = (int**)malloc(sizeof(int*) * row); if (pArray == NULL) return NULL; for (int i = 0; i < row; i++) { //一级指针 pArray[i] = (int*)malloc(sizeof(int) * cols); } return pArray; } int main() { int** p = createArray2D(4, 3); for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { p[i][j] = i * j; printf("%d\t", p[i][j]); } printf("\n"); } return 0; }
C++与C的区别(一),见以下链接 https://blog.csdn.net/qq_54492880/article/details/121302703