1.数组
1.1 概念
数组常见形式:T a[N]
二维数组常见形式:T a[N][M];
T为类型名,如char,double,int等,N为正整数或值为正整数的常量表达式。a表示数组a的首地址,a[i]的地址即为a+i*sizeof(T)
数组的元素访问
- 通过数组下标访问,a[i]
- 通过指针访问,假设数组a的首地址为p,则a[i]的地址为p+i x siezeof(T)
1.2 初始化数组
数组在定义时使用{}初始化列表数组
形式为:类型名 数组名[常量表达式] = {值, 值,…};
int a[3] = {1};
int b[3] = {0, 1, 2};
int c[] = {0, 1, 2};
数组赋值:
1、初始化列表
2、使用memset,void *memset(void *str, int c, size_t n),对于数组n不能超过数组大小
3、使用循环语句赋值
字符数组初始化
char d[] = “1234”;//sizeof(d) = 5
d[2] = ch;//当ch = “0”、0、‘0’、“\0”、'\0’时,对数组d的打印效果?
分别为0,空,0,空,空
二维数组的元素访问
1、通过下标:a[i][j]
2、假设数组a的首地址为p,则a[i][j]的地址为p+i x M x sizeof(T) + j x sizeof(T)
1.3 动态数组与数组越界
动态数组
1、由使用者在运行过程中申请内存创建,并在使用后释放
2、使用new或malloc动态分配内存,大小在申请时确定
3、由使用者通过delete或free释放内存
int *p = (int *)malloc(5);
free§;
p =NULL;
1.4 数组越界
- 用变量作为数组下标时,不小心会导致数组越界(变量下标值变为负数,或者太大)
- 可能引起意外修改其他变量的值,导致程序运行结果不正确
- 可能试图访问不该访问的内存区域,导致程序崩溃
- 数组越界的程序,用某些编译器编译后可能可以正确运行,换一个编译器编译后就运行错误
2. 字符串
2.1 字符串表现形式
字符串的三种表现形式:
1、使用字符数组存储,char a[N],字符数组可以直接使用字符串初始化,仍以字符’\0’结尾
- 用char数组存放字符串,数组元素个数应该至少为字符串长度+1
- 包含’\0’字符的一维char数组,就是一个字符串。其中存放的字符串为’\0’前面的字符
- 字符数组可以用cout,printf输出,cin,scanf输入,输入时会在末尾自动加’\0’
2、字符串常量,如“c program”,以字符’\0’结尾,包括转移字符
- 字符串常量占据内存字节数能与字符串字符数+1,多出来是结尾的’\0’
- ""也是合法的字符串常量,称为“空串”。空串占据一个字节,为’\0’
3、使用string,string是C++标准库的一个类,专门用于处理字符串,结尾没有’\0’
2.2 字符数组
用char数组存放字符串,数组长度为字符串长度+1
char数组的内容可以在初始化时设定,库函数修改,指定修改某个位置的字符
字符数组在输入时,用cin或scanf,遇到空格时结束
写数组名就可以
char arrat[10];
scanf(“%s”, array);
2.3 字符串库函数
cin.getline(char buf[], int bufsize);
读入一行(行长度不超过bufsieze-1)或bufsize-1个字符到buf,自动添加’\0’,回车换行符不会写入buf,但是会从输入流中去掉
gets(char buf[]);
读入一行,自动添加’\0’,回车换行符不会写入buf,但是会从输入流中去掉
使用字符串函数需要#include,c++版本的字符串头文件,对应c的<string.h>
字符串拷贝:拷贝src到dest,并返回指向dest字符串的指针:
char *strcpy(char *dest, const char *src);
字符串比较大小:返回0则相等,小于0则s1<s2,大于0则s1>s2
int strcmp(const char *s1, const char *s2);
求字符串长度:不算结尾的’\0’,返回字符串长度
size_t strlen(const char *s);
字符串拼接:s2拼接到s1后面,并返回指向dest字符串的指针
char *strcat(char *dest, const char *s2);
2.4 字符串-string
C++的string类是一个模板类,使用时需要#include
string的初始化:
- string s1(“Hello”);
- string s2 = “xhorse”;
- string s3(6, ‘x’)
string 对象的长度用成员函数length()读取
string s(“hello”);
cout << s.length() << endl;
string支持流读取运算符
string stringObject;
cin >> stringObject;
3 函数综合
3.1 函数概念
概念:实现某一功能的可复用代码的集合体
表现形式:返回值类型 函数名(T1 param1, T2 param2…)
{
语句组(即“函数体”)
}
参数名可以省略。如果需要结果,使用return返回,不需要结果时返回值类型为void
函数的形参是实参的一个拷贝,所以形参的改变一般不会影响到实参
形参:定义函数时,函数参数列表的参数名,用在函数内部
实参:调用函数时,根据函数参数要求实际传入的参数
省略参数:在函数声明参数列表中使用…,定义时给出具体类型
声明省略参数名:C++相比与C允许在定义时省略参数名,只有参数类型
默认缺省参数:C++允许形参列表中的形参带有默认值,并在调用函数时缺省该参数
3.2 函数参数
参数包括传值,传指针,传引用
传值:把实参的值传给函数,形参是实参的拷贝,所以形参的修改不会改变实参的值,在C++中,部分情况下如传对象时会调用对象的拷贝构造函数,造成一定的计算开销
传指针,把实参的地址传递给函数,传指针可以修改实参的值,相比值传递效率更高。缺点:指针计算一旦越界,会造成不可预测的错误
传引用,在C++中,引用作为一个变量或实例的别名,在传递参数时会直接指向实参