您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-02 22:43 429 查看
使用列表的方法初始化数组,如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个元素的数组
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++