目录
创建数组就很简单了,就直接typeName arrayName[size],这里的typeName 可以是你自己定义的结构体,也可以是基本数据类型,然后这里的size如果是在VS编译器中,必须是常量或者是const变量,这里的常量是说你直接把size写死,比如int a[5]。
但是实际这种还是不太方便,因为我们有时候确实不知道数组应该开多大,这里就需要我们去动态的申请数组,也就是使用new,直接用代码讲解
using namespace std;
int main()
{
int size;
cin >> size;
int i;
//创建部分
int* myArrat = new int[size];
for (int i = 0;i < size;i++)
{
myArrat[i] = i;
}
//使用部分
for (int i = 0;i < size;i++)
{
//这里的myArrat指向空间的首地址,myArrat+i表示跳到下一个元素的地址
*(myArrat + i) = 10 * i;
}
for (int i = 0;i < size;i++)
cout << myArrat[i] << endl;
return 0;
}
初始化部分
除了常规的初始化方法,也可以使用上一篇讲过的大括号的方法
int a[5] = {0} 所有元素初始化为0
int a[5] = {10} 第一个元素为10,后面都为0
int a[5]{} 所有元素初始化为0
同样大括号不允许缩窄转换,及不允许int a[5]{1.0}
字符串C风格字符串
C风格字符串就是以空字符’\0’结尾的char数组,下面代码可以看出,strlen等字符串操作函数都是以最后的空字符作为结束的标记
char a[3] = { 'a', 'b', 'c' };
char b[4] = { 'a', 'b', 'c', '\0' };
cout << strlen(b) << endl; //3
cout << sizeof(b) << endl; //4
但是上面这种方法未免太过麻烦, 需要一个字母一个字母的写,所以有了下面这种写法
char a[] = “hello world”;
这种写法char数组a的长度会被编译器自动初始化,然后"hello world"被称为字符串常量
输入
关于cin>>,cin.getline(str, size),cin.get(str,size),cin.get(),以及getline(istream,string)混合使用及可能出现的问题
我自己的话总结一下就是,cin>>在你输入的时候,你按回车,会把你敲得东西放进缓冲区,然后回车产生的换行符也被送了进去,然后检测到缓冲区有换行,cin>>便把缓冲区的数据放进变量里,然后换行符还在缓冲区,这样紧接着使用cin.getline(str, size),cin.get(str,size),以及getline(inStream,str)时就会把换行符读走,导致和我们想的不一样,那为什么连续两次使用cin却不会异常呢,因为cin的时候,并不是只要读取到回车符就执行完cin,而是必须要读取到相对应的类型的内容从键盘敲入,才会真正执行完cin,不允许输入为空,所以cin>>在等待键盘敲入时,你哪怕先敲回车符,cin>>语句也不会执行结束
string类简介头文件 #include,然后string str,str的类型是一个string,但是str[0]的类型是一个char,然后string的对象可以自动改变大小,初始化的话既可以使用大括号,也可以直接指定字符串常量上去
赋值,拼接和附加
之前我们使用char数组的时候,如果需要进行赋值,可能会出现问题,但是string的话就不会了,比如下面这段代码
string str1 = "hello";
string str2 = str1;
char ch1[6] = "hello";
char ch2[10];
strncpy_s(ch2, ch1, 2);//这里表示从ch1中拷贝两个字符到ch2中,但是ch2是否有空间存储,这个无法判断,如果是char ch2[1]的话,还是会有运行时错误
cout << str2 <<"---"<<ch2;
但是string就不会出现这种问题,因为可以自己调整容量,这一点可以通过string类的capacity方法查看,这个方法返回的就是系统为string对象开辟的容量,当容量满的时候,会自动添加,而且扩容也是有规律的,至于为什么是16,应该是和不同的平台或者编译器有关
(环境为vs2019)
string str1 = "hello";
cout << str1.size() << endl; //5
cout << str1.capacity() << endl; // 15
str1 = "hello hello hello";
cout << str1.size() << endl;//17
cout << str1.capacity() << endl;//31
str1 = "hello hello hello messi messi messi";
cout << str1.size() << endl;//35
cout << str1.capacity() << endl;//47
上述代码在Dev C++中的测试结果为
5
5
17
17
35
35
在Ubuntu19.04 g++8.3.0中测试结果,是直接翻倍的
5
15
17
30
35
60
拼接的话,char数组使用strncat,string直接用+号就行了,然后这里只是做一个简介,因为后面第十六章的时候还会详细介绍