一、动态空间申请
1. 动态分配内存概述
数组的长度是预先定义好的,在整个程序中固定不变,但是在实际编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,无法预先确定,为了解决上述问题,C++提供了一些关键字,可以按需要动态的分配内存空间,也可以把不再使用的空间回收再次利用
2. 动态分配、静态分配
(1)静态分配
①. 在程序编译或运行的过程中,按事先规定大小分配内存空间的分配方式。int a[10]
②. 必须事先知道所需空间的大小
③. 分配在栈区或全局变量区,一般以数组的方式
(2)动态分配
①. 在程序运行过程中,根据需要大小自由分配所需空间
②. 按需分配
③. 分配在堆区,一般使用特定的关键字进行分配
3. new和delete
(1)new和delete操作基本类型空间
new申请堆空间,delete释放空间
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int *p1 = NULL;
p1 = new int; // 从堆区申请int类型大小的空间
*p1 = 100;
cout << "p1 = " << *p1 << endl; // 100
// 释放空间
delete p1;
// new申请空间的同时可以初始化空间内容
int *p2 = NULL;
p2 = new int(100);
cout << "p2 = " << *p1 << endl; // 100
delete p2;
return 0;
}
(2)new和delete操作数组空间
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int *arr = NULL;
arr = new int[5]{10,20,30,40,50};
for(int i =0;i<5;i++)
{
cout << *(arr+i) << ' ';
}
cout << endl;
// 如果new有[] 那么delete也需要[]
delete [] arr;
return 0;
}
二、字符串处理函数
1. 字符串操作函数
以 str 开头为字符串处理函数 默认遇到 '\0' 结束操作
#include <string.h>
①. 测量字符串长度 strlen
#include <iostream>
#include <string.h>
using namespace std;
int main(int argc, char *argv[])
{
char str1[128] = "hello world!";
cout << "字符串str1的长度为:" << strlen(str1) << endl; // 12
char str2[128] = "hello w\0rld!";
cout << "字符串str2的长度为:" << strlen(str2) << endl; // 7
return 0;
}
②. 字符串拷贝函数 strcpy,strncpy
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
字符串拷贝时遇到 '\0' 结束
size_t n 是一个结束条件,为要拷贝的字符串的长度
dest:目标地址空间
src:原字符串的首元素地址
#include <iostream>
#include <string.h>
using namespace std;
int main(int argc, char *argv[])
{
char dest0[128] = "";
char dest1[128] = "";
char dest2[128] = "";
char src0[] = "hello world";
char src1[] = "hello\0world";
strcpy(dest0,src0);
strcpy(dest1,src1);
strncpy(dest2,src1,2);
cout << dest0 << endl; // hello world
cout << dest1 << endl; //hello
cout << dest2 << endl; // he
return 0;
}
③. 字符串追加函数 strcat,strncat
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
将scr指向的字符串追加到dest指向的字符串的尾部
size_t n 将src字符串的前n个字符进行追加
#include <iostream>
#include<string.h>
using namespace std;
int main(int argc, char *argv[])
{
char dest0[128] = "hello";
char src0[128] = " ";
char src1[128] = "world";
strcat(dest0,src0); // hello+空格
strcat(dest0,src1);// hello world
cout << dest0 << endl;
return 0;
}
#include <iostream>
#include<string.h>
using namespace std;
int main(int argc, char *argv[])
{
char dest0[128] = "Hello";
char src0[128] = ",";
char src1[128] = "Tom和Jerry";
strcat(dest0,src0); // hello,
strncat(dest0,src1,3);
cout << dest0 << endl; // Hello,Tom
return 0;
}
④. 字符串比较大小函数 strcmp,strncmp
int strcmp(char *s1, const char *s2);
int strncmp(char *s1, const char *s2, size_t n);
size_t n 比较前n个字符
返回值:
>0 s1字符串 > s2字符串
<0 s1字符串 < s2字符串
==0 s1字符串 == s2字符串
#include <iostream>
#include<string.h>
using namespace std;
int main(int argc, char *argv[])
{
char str1[128] = "";
char str2[128] = "";
while(1)
{
cout << "请输入第一个字符串:";
cin >> str1;
cout << "请输入第二个字符串:";
cin >> str2;
if(strcmp(str1,str2)>0)
{
cout << str1 << "大于" << str2 << endl;
}
else if(strcmp(str1,str2)<0)
{
cout << str1 << "小于" << str2 << endl;
}
else if(strcmp(str1,str2)==0)
{
cout << str1 << "等于" << str2 << endl;
}
}
return 0;
}
#include <iostream>
#include<string.h>
using namespace std;
int main(int argc, char *argv[])
{
char str1[128] = "Hello Tom";
char str2[128] = "Hello Jerry";
cout << strncmp(str1,str2,5) << endl; // 0
cout << strncmp(str1,str2,6) << endl; // 0
cout << strncmp(str1,str2,7) << endl; // 10(大于0)
return 0;
}