4.数组和指针

1 数组 是用来保存 单一类型 的一组对象 的容器, 数组的长度固定,一经定义便不能更改。
2 数组定义:
数组是一种复合数据类型,由 类型名 标示符 维数 组成。
数组的 元素 可以是 内置数据类型 和 类类型, 但是不能是引用类型。
数组的 维数 必须是 大于或等于一的 常量表达式。
字面值常量,枚举常量,常量表达式定义的 const 对象。


3 数组的初始化:
1 在函数体外定义内置类型数组,其元素默认初始化为0;
2 在函数体内定义内置类型数组,气元素不进行自动初始化;
3 若元素为类类型,则无论数组定义在何处,元素将调用默认构造器初始化,无默认构造器的类类型元素必须显示调用初始化式。


4 不允许数组间接复制:
int a[] = {1, 2, 3};
int b[](a); //error
int c[3];
c = a; //error


5 数组的操作:


1通过下标操作数组元素:
int main()
{
const size_t array_size = 10;
int array[array_size];

for (size_t index = 0; index < array_size; ++index)
array[index] = index;


return 0;
}


6 指针:
指针 是一种用来保存 对象地址 的复合类型。指针时数组的迭代器。


7 指针初始化:
int *pi = 0; //初始化空指针,通过0值常量表达式
int *p  = NULL; //初始化空指针
int val = 1024;
int *ptr = &val; //初始化指针,通过地址


#对位初始化的指针进行解引用操作将会导致程序奔溃
#编译器可以检测出 0 值的指针


8 void 类型指针:
void类型指针 是 特殊的指针,它可以用来保存任意类型对象的地址。
int val = 1024;
void *vptr = &val;


void类型指针由于不确定指针的类型,因此不能通过它直接操作指向的对象,
必须进行强制类型转换。


9 指针操作:
解引用操作:
cout << *ptr; //直接操作指向的对象
ptr = p; //指针复制操作,改变指针关联对象


10 指针和引用的区别:
引用必须初始化,且不能在定义后改变绑定对象;
给引用赋值将改变关联对象的值,给指针复制将改变指针的关联对象;
不存在引用的引用,但是存在指针的指针和指针的引用。


11 通过指针访问数组:
ptrdiff_t distance = ptr1 - ptr2; //同一数组的两个指针可以计算距离

#允许数组的指针计算 数组的超出末端地址,但是不能对超出末端地址进行解引用,
#也不允许计算超出末端元素之后 和 数组首元素之前 的地址。


12 指针 和 const :
指向const对象的指针:
const int *ptr = &val;
int const *ptr1;
ptr1 = &val;


指向const对象的指针表示 不能通过该指针改变 指向对象的值,但是指针
本身是可以改变关联对象的。


const 指针:
int * const ptr = &val;


此时 const 修饰指针本身,即此时该指针是一个 指针常量,定义时必须初
始化,且不能在初始化后 改变其 关联对象。


#允许把非const对象绑定到 const 指针, 但是不能 把 const对象绑定到 非const指针
char * message = "hello world!"; //error


13 动态数组:
动态数组允许 数组的维数 在运行期间确定。定义的动态数组将一直存在,直至显式释放。


动态数组的定义:
int *ptr = new int[10]; //无需定义数组名称,将返回数组的首元素地址
int *ptr = new int[10](); //在定义时跟上圆括号表示将数组元素初始化成默认值


#动态数组 的初始化 只能将元素初始化成默认值。


const 对象的动态数组:
const int *ptr = new const int[10]();


释放动态数组的空间:
delete[] ptr;


14 数组 指针 和 容器 迭代器 的兼容:


1 可以直接用字符串初始化string对象:
string s("hello");


2 可以直接连接字符串和string对象:
s += "data";


3 可以将string对象转换成 字符串:
char *c = s.c_str();


#c_str()返回的数组并不一定有效,因为对s的操作可能改变其值,最好将它复制未副本。


4 可以用数组的指针初始化容器:
int array[10];
vector<int> vec(array, array+10); //此时array是数组的首元素地址,array+10是数组超出末端元素地址。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值