数组、指针和字符串

1. 数组

1.1 声明与使用

声明:

数据类型 数组名[常量表达式1][常量表达式2]...;

1.2 存储与初始化

声明数组是可以给出数组元素的初值:

数组类型 数组名[] = {, , ,...};

1.3 数组作为函数参数

数组元素和数组名都可以作为函数的参数使用。使用数组名作为参数时,传递的是数组的地址,数组名即是第一个元素的指针。实参数组的长度应该不少于形参数组的长度。

1.4 对象数组

2. 指针

指针存放的是某个数据的地址。

2.1 声明

数据类型 *标识符;

2.2 运算符

“*”:获取指针所指向的变量的值。

“&”:取的某个对象的地址。

2.3 指针运算

加减运算:表示指针当前所指位置前后n个数的地址,是按存储数据类型的字节大小来运算

*(p + n)也可以写成p[n],因此,数组名实际上就是一个不可被再次赋值的指针变量,它指向第一个数组元素,也表示数组的地址。

0用来表示空指针,也可以用NULL表示。

2.4 指针数组

形式:

数据类型 *数组名[下标表达式];

2.5 指针作为函数参数

(1)使实参与形参指向共同内存空间,可以改变实参,效果同引用。

(2)减少数据传递的开销。

(3)通过指向函数的指针传递函数代码的首地址。

2.6 指针型函数

函数的返回值是指针。

形式:

数据类型 *函数名(参数表)
{...}

2.7 指向函数的指针

函数指针就是专门用来存放函数代码首地址的变量。函数指针与函数名具有一样的作用。形式:

数据类型 (*函数指针名)(形参表);

赋值:

函数指针名 = 函数名;

2.8 对象指针

访问对象成员语法形式:

对象指针名->成员名

指向对象的非静态成员的指针:

类型说明符 类名::*指针名;   //指向数据成员
类型说明符 (类名::*指针名)(参数表)

在声明之后对齐赋值:

指针名 = &类名::数据成员名;
指针名 = &类名::函数成员名;

利用指针调用成员函数:

(对象名.*类成员指针名)(参数表)
或
(对象指针名->*类成员指针名)(参数表)

指向类的静态成员的指针

对类的静态成员的访问是不依赖于对象的,因此直接用普通的1指针即可。

2.9 动态内存分配

new运算符

创建形式:

new 数据类型(初始化参数列表)

若建立的对象时一个基本变量,参数列表为其初值。

若建立的对象是某个类的实例对象,根据参数列表调用构造函数。

创建一维数组:

new 类型名[长度];  //不初始化
new 类型名[长度]();  //初始化为默认值

使用new动态创建数组是可以使用变量定义数组长度的。

delete运算符

用来删除由new创建的对象。

delete 指针名;

删除数组:

delete[] 指针名;

3. vector创建动态数组

无论是静态数组还是用new创建的动态数组都难以检测下标越界的错误。vector是一个类模板。

定义形式:

#include <vector>
vector<元素类型>数组对象名(数组长度);

vector创建的是数组对象,数组对象名不是数组的首地址。

vector定义的数组对象的所有元素都会被初始化,如果是类类型将会调用默认构造函数。

也可指定初值:

vector<元素类型>数组对象名(数组长度, 元素初值); 

重要成员函数:size()

4. 字符串

4.1 字符数组

可以用字符指针来存储字符串常量。

const char* STRING1 = "This is a string.";

用字符数组来存储字符串变量。

char str[8] = "program";
char str[] = "program"; 

4.2 string类

#include <string>

4.2.1 定义:

string str = "";

4.2.2 常用操作符

string类的操作符包括:+, =, +=, ==, !=, <, <=, >, >=, []。

s[i]只访问下标为i的字符。

4.2.3常用成员函数

//将字符串s添加在末尾
string append(const char* s);

//赋值
string assign(const char* s);

//比较大小
int compare(const char* s); 

//将字符串s插入至位置p0之前
string & insert(unsigned int p0, const char* s);

//取子串
string substr(unsigned int bp0, unsigned int n) const;

//查找
unsigned int find(const basic_string &str) const;

//字符串长度
unsigned int length() const;

//交换
void swap(string &str);

4.2.3 getline()函数

getline()是头文件string定义的函数,cin读取键盘输入空格可作为间隔符,getline()则是读取一整行的数据,包括空格符。

用法:

getline(cin, s2);

getline()也可定义新的分隔符,用法是将新的分隔符作为第三个参数:

getline(cin, s2, ',');

5. 指针安全性

5.1 类型转换符

int i = 2;

floaty x = static_cast<float>(i);

float* p = reinterpret_cast<float*>(&i);

void foo(const int* cp)
{
    int *p = const_cast<int *>(cp);
}

static_cast用来进行比较安全的、基于内容的基本数据类型转换。

reinterpret_cast是一种基于底层的、具有很大危险性和不确定性的数据类型转换。

const_cast用来将数据类型中的const属性去除,只适用于将常指针转化为普通指针,常引用转化为普通引用,不能用来将常对象转化为普通对象,因为转化本身就是生成一个副本。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值