C++基础4:数组与字符串

目录

一、数组

1.初识数组

2.变长数组

3.未知长度数组

4.数组元素的读写

5.多维数组

6.常量数组

二、字符串 

1.数组字符串

2.字符串长度

3.常量字符串

4.字符串的操作和属性获取

5.string类


一、数组

1.初识数组

a)一段连续内存,存放固定数目对象,一旦申请完毕,元素个数不可更改

b)元素类型不定:基本数据类型(int, float, bool等)或structure, class, pointer, enumeration,

int num_array1[5]; //未初始化,数值随机 
int num_array2[5] = {0, 1, 2, 3, 4}; //初始化

C++基础4:数组与字符串

2.变长数组

数组大小固定,其长度是由变量指定

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 ++;
}

变长数组不可初始化,先声明数组,创建之后,逐个元素赋值

3.未知长度数组

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是数组首地址

4.数组元素的读写

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;

 没有边界检查,效率高

5.多维数组

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

内存是一维的只能二维只能按一维方式去存

第一行存完,存第二行

6.常量数组

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;
}

二、字符串 

1.数组字符串

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)

2.字符串长度

size_t strlen( const char *str )
char name[10] = {'Y', 'u', '\0', 'S', '.', '0'};
cout << strlen(name) << endl;//2 

3.常量字符串

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

4.字符串的操作和属性获取

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第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值

5.string类

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)

上一篇:简单html和css静态网页制作


下一篇:C#中的显式转换