数据结构(自用)

本文详细介绍了C++中的数组,包括一维数组、二维数组的定义、初始化及动态分配,以及数组越界问题。此外,讲解了字符串的三种表现形式和常用操作,如字符串库函数cin.getline、gets、strcpy等。最后,概述了函数的概念、参数传递方式,以及函数参数的默认值设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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++中,引用作为一个变量或实例的别名,在传递参数时会直接指向实参

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值