目录
一、数组
1.初识数组
2.变长数组
3.未知长度数组
4.数组元素的读写
5.多维数组
6.常量数组
二、字符串
1.数组字符串
2.字符串长度
3.常量字符串
4.字符串的操作和属性获取
5.string类
a)一段连续内存,存放固定数目对象,一旦申请完毕,元素个数不可更改
b)元素类型不定:基本数据类型(int, float, bool等)或structure, class, pointer, enumeration,
int num_array1[5]; //未初始化,数值随机 int num_array2[5] = {0, 1, 2, 3, 4}; //初始化
数组大小固定,其长度是由变量指定
int len = 1; while ( len < 10 ) { int num_array2[len]; //variable-length array cout << "len = " << len; cout << ", sizeof(num_array2)) = " << sizeof(num_array2) << endl; len ++; }
变长数组不可初始化,先声明数组,创建之后,逐个元素赋值
a)长度由初始化列表决定
int num_array[ ] = {1, 2, 3, 4}; // the type of num_array is "array of 4 int"
b)用于函数参数
float array_sum(float values[], size_t length); float array_sum(float *values, size_t length);
values是数组首地址
int array1[4] = {9,8,7,6}; int array2[4]; array2 = array1; //error! array1 array2是数组首地址,将array2 = array1,两者会指向同一个数据,原来数据会丢失,语法禁止操作,array2的地址不可更改 array2[0] = array1[0]; //okay array2[1] = array1[1]; //okay array2[2] = array1[2]; //okay array2[3] = array1[3]; //okay
Index | Value | Address |
| ||
| p+19 | |
| p+18 | |
| p+17 | |
| p+16 | |
3 | 6 | p+15 |
p+14 | ||
p+13 | ||
p+12 | ||
2 | 7 | p+11 |
p+10 | ||
p+9 | ||
p+8 | ||
1 | 8 | p+7 |
p+6 | ||
p+5 | ||
p+4 | ||
0 | 9 | p+3 |
p+2 | ||
p+1 | ||
p+0 | ||
| p-1 | |
| p-2 | |
| p-3 | |
| p-4 | |
|
注意:c++中数组没有边界检查,如果越界依然会操作,没有警告
int num_array[5]; for(int idx = -1; idx <= 5; idx++) num_array[idx] = idx * idx;//-1:p-1 array[-1]=1 for(int idx = -1; idx <= 5; idx++) cout << num_array[idx] << endl;
没有边界检查,效率高
a)
int mat[2][3] = {{11,12,13}, {14,15,16}};
b)读写
for (int r = 0; r < rows; r++)//行 { for(int c = 0; c < cols; c++)//列 cout << mat[r][c] << ","; cout << endl; }
c)未知长度的二维数组
void init_2d_array(float mat[][], //error size_t rows, size_t cols) void init_2d_array(float mat[][3], size_t rows, size_t cols)
一定要写上有多少列,不然找不到第二行,只有第一行的首地址
Index | Value | Address |
| ||
| p+25 | |
| p+24 | |
[1][2] | 16 | p+23 |
p+22 | ||
p+21 | ||
p+20 | ||
[1][1] | 15 | p+19 |
p+18 | ||
p+17 | ||
p+16 | ||
[1][0] | 14 | p+15 |
p+14 | ||
p+13 | ||
p+12 | ||
[0][2] | 13 | p+11 |
p+10 | ||
p+9 | ||
p+8 | ||
[0][1] | 12 | p+7 |
p+6 | ||
p+5 | ||
p+4 | ||
[0][0] | 11 | p+3 |
p+2 | ||
p+1 | ||
p+0 | ||
| p-1 | |
| p-2 |
内存是一维的只能二维只能按一维方式去存
第一行存完,存第二行
const float PI = 3.1415926f; PI += 1.f; // error const float values[4] = {1.1f, 2.2f, 3.3f, 4.4f}; values[0] = 1.0f; // error
元素不可修改
常用在函数里面,数组传进函数有可能被修改
float array_sum(const float values[], size_t length) { float sum = 0.0f; for (int i = 0; i < length; i++) { sum += values[i]; //values[i] = 0; //error防止这样的误操作 } return sum; }
char rabbit[16] = {'P', 'e', 't', 'e', 'r'};//空余的会置零 char bad_pig[9] = {'P', 'e', 'p', 'p', 'a', ' ', 'P', 'i', 'g’}; //a bad one! //不加结束数组会越界 char good_pig[10] = {'P', 'e', 'p', 'p', 'a', ' ', 'P', 'i', 'g', '\0'};//加'\0',为字符串结束标志('\0'编码值为0,字符0‘0’编码值不是0)
size_t strlen( const char *str ) char name[10] = {'Y', 'u', '\0', 'S', '.', '0'}; cout << strlen(name) << endl;//2
char name1[] = "Southern University of Science and Technology";//先数多少个字符再加1创建数组,再放字符串再加0截断 char name2[] = "Southern University of " "Science and Technology";//两个字符串连接 char name3[] = "ABCD"; //how many bytes for the array?
0//整数0 | name3+4 |
'D' | name3+3 |
'C' | name3+2 |
'B' | name3+1 |
'A' | name3+0 |
字符串长度4,数组长度5
更大的字符串空间
const wchar_t[] s5 = L"ABCD"; const char16_t[] s9 = u”ABCD"; //since C++11 const char32_t[] s6 = U”ABCD"; //since C++11
a)copy
char* strcpy( char* dest, const char* src );//若dst容量不够,如src100个元素,dest长度是10,依然会做100字符拷贝操作,溢出90个(越界) char *strncpy(char *dest, const char *src, size_t count);//count最多拷贝count个,一般可以设count为dest src中的最小值
b)字符串连接
char *strcat( char *dest, const char *src );
c)比较
int strcmp( const char *lhs, const char *rhs );
是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值
std::string str1 = "Hello"; std::string str2 = "SUSTech"; std::string result = str1 + ", " + str2;//3个字符串相加
长度result.length()
更宽的字符
std::string std::wstring std::u8string //(C++20) std::u16string //(C++11) std::u32string //(C++11)