C++数组,字符串,string,结构,共用体,枚举,指针,静态动态内存,vector及array类简介

使用列表的方法初始化数组,如int cards[4]={3,6,8,9},列表初始化不允许缩窄,如果列表中的元素不足,则其他的自动设置为0。

字符串后面会自动加‘\0’表示结束,如char boss[8]="bozo"在内存中为“bozo\0\0\0\0”,字符常量是用单引号,字符串常量是用双引号。字符串是可拼接的,如cout << "f*ck" "you";输出的是f*ckyou。

与字符串相关的函数存放在<cstring>文件中,strlen()计算的是可见字符串的长度,sizeof()计算的是总的长度

字符串的输入:cin使用空白(空格,制表符,换行符)来确定字符串结束的位置,因此使用cin不能将带空白的输入流存储到数组中;cin.get(array,arraysize)将整行读取进数组array,但不会吸收输入流中的换行符,因此要再用cin.get()吸收;cin.getline(array,arraysize)也将整行读取进数组,并会吸收换行符转换为‘\0’。

在使用cin输入时会在输入流中留下换行符,但这不会影响下一个cin的输入,会影响cin.getline(),cin.get()输入。

可使用列表初始化的方法初始化string类,如string s1={“google”};可直接使用=或者+对string进行赋值或拼接,但对字符数组不行。string输入整行的方法为getline(cin,str),它自己会自动将换行符吸收转换为'\0'。

对于char数组,要实现赋值使用strcpy函数,实现拼接使用strcat函数,如:char a[15]={“google”},b[5]={“hola”};用strcpy(a,b)将b数组(包括一个结束符‘\0’)复制到a数组中,即a数组变成“hola\0e”,原来的googl被hola\0所取代。strcat(a,b)则是将b数组拼接到a数组之后,即a数组变成"googlehola"。

C++11新增了原始(raw)字符串,原始字符串使用“()”来做定界符,如cout<<R"(jim "king" tutt "\n" instead)"<<endl;显示的是jim "king" tutt "\n" instead。可在”和(间添加任意字符作为定界符,如cout<<R"+*(fuck you)+*"也是可以的,即R“。。。(  )。。。”,。。。为任意字符。

结构体可以使用列表初始化的方法进行初始化,如:

struct student
{
	char name[20];
	int age;
	float price;
};
int main()
{
	student stu1 = { "珍发",12,3.6 };
}
外部声明即为不在任何函数中的声明,可被文件中所有的函数引用,内部声明仅可以在该函数内部使用。

可以使用赋值运算符将结构赋给同类型的结构体。

共用体(union)占用的大小不仅取决于成员中占用空间最大的那一个,还取决于内存对齐,如:

union student
{
	int a;//int 占用4个字节
	float b;//float占用4个字节
	char c[6];//占用6个字节
};
int main()
{
	cout << sizeof(student);//结果为8字节,因为要考虑内存对齐
}
枚举:

enum spectrum
{
	red, orange, yellow, green
};
int main()
{
	spectrum band = yellow;//band的值只能在4个枚举值中选一个
}
enum spectrum
{
	red, orange, yellow, green
};
int main()
{
	int color = green;//可以,color的值为3
	spectrum band = (spectrum)2;//必须强制类型转换,将int值转换为spectrum,否则不能
	color = 3 + red;
}
可以显式地设置枚举量的值,如:

enum spectrum
{
	red, orange = 100, yellow
};
red的值没有设置,默认为0,yellow的值比前一个枚举量大1,因此为101
枚举的取值范围由上限和下限决定,枚举的上限是大于枚举量最大值的最小2的幂的结果再减去1;如果枚举量的最小值大于0,则下限为0,若小于0,则计算方法和求上限类似,如:最小枚举量为-6,则比它小的最大的2的幂是-8(加上负号),所以下限为-7。例如下面代码是合法的:
enum spectrum
{
	red=1, orange = 100, yellow
};
int main()
{
	spectrum band = (spectrum)0;
}
 指针和地址:int apple=10,int *p=&apple,则p的值为apple的地址,*p的值=10。

int *pt;
	pt = (int*)0xB8000000;
上面的语句是可行的,但一定要加上(int*)告诉计算机后面的数字是指向Int型的地址。

使用new来分配内存,int*pt=new int,int*arpt=new int[10],相应地使用delete pt和delete [] arpt来释放内存。

C++将数组名解释为数组第一个元素的地址,设pt为指向Int数组的指针,则对pt+1就是地址值增加4个字节。

指针数组和数组指针的区别:

int ar[10] = { 0 };
	cout << ar << endl;//显示ar[0]的地址
	cout << &ar << endl;//显示整个ar数组的地址
	int(*pt)[10] = &ar;//pt先与*结合,则其为指针,为指向整个ar数组的数组指针,(*pt)和ar等价,*(*pt+i)或者(*pt)[i]才是该元素的值
	int *p[10];//p先与数组结合,则其为数组,故为指针数组,即存放指针的数组。
自动存储,静态存储,动态存储:

自动存储即是局部变量,在函数调用时出现,结束时释放,它使用自动存储空间;静态存储是整个程序执行期间都存在的存储方式,使变量成为静态的方式有两种:一是在函数外面定义它,二是在声明变量前使用关键词static, 如static int apple=10;动态存储是使用new和delete让你能够在一个函数中分配内存,而在另一个函数中释放内存。

模板类vector:实际是一种动态数组:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>vec;//创建对象vec
	vec.push_back(a);//尾部插入数字a
	vec[i];//下标访问元素
	vec.insert(vec.begin() + i, a);//插入元素a
	vec.erase(vec.begin() + i);//删除元素
	vec.erase(vec.begin() + i, vec.end() + j);
	vec.clear();//清空
	vec.size();//大小
	vector<int>vec(n);//创建n个元素的数组
}









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值