31数组定义
定义
- 指针是C++数组工作的基础
- 数组是元素的集合,按特定顺序排列的一堆东西,表示一堆变量组成的集合。
- 一般是一行相同类型的变量
- 数组一般和for循环放在一起,通过索引index来遍历。设置数组的每一个值
- 数组是连续的数据块,可以像索引一本书一样的索引他们
数据类型
Int :允许在给定范围内存储一个整形数字。
int(integer)是4个字节(byte)大小的数据类型 -2b to 2billon
signed int 带符号整数,有正负,符号占一个
- 一个字节byte是8比特(bit)的数据 4个byte is 32 bits的数据
- signed int 带符号 符号占一个bit 剩下31个bit位置留给实际数字 。每个bit可以是 0或者1 (a bit can either be zero or one) 1bit的数据有两种可能的值
- 有31个bit,每个bit2种可能的值, 2的31次方是2,147,483,648 “0”要单独储存 所以在int里面可以储存的最大数字是2,147,483,647 符号一变就是-2,147,483,647 有一个bit用来计算符号
- Unsigned int 有32bit ,总是正的 2的32次方是4,294,967,296 所以 unsigned int最大储存数字为 4,294,967,295 说明:4,294,967,296打印出来就是0 4,294,967,297打印出来是1,感觉开始重复从0开始。
代码说明
#include <iostream>
int main()
{
int example[5];//definition 并分配空间
int* ptr = example;
//set and access
for(int i=0;i<5;i++)
{
example[i] =i+ 1; //index
std::cout << example[i] << std::endl;
}
std::cout <<"占内存大小为"<<sizeof( example )<< std::endl;//直接打印,指针类型,打印出内存地址 debug这个输入example可以看到他本事的地址
std::cout << example << std::endl;//直接打印,指针类型,打印出内存地址 debug这个输入example可以看到他本事的地址
//用example[i]访问特定索引时候,其实是对example指针所在的内存取了一个偏移量 eg
example[2] = 19950924;
std::cout << example[2] << std::endl;
//example[2] = 19950924;等同于下面指针算数ptr+2、这里的+2并不是指字节 指的是字节偏移量,取决于数组类型。int类型就是 偏移 2x4=8个字节 1byte=8bits 4byte=32bits
*(ptr + 2) = 4295991;//*解引用,便可以赋值了
std::cout <<"数组的值被指针运算重写为"<< example[2] << std::endl;
//如果用字节处理上述的赋值过程
//首先将ptr指针转换为一个字节的类型 (char*) ptr ,再加8个字节
//想写入的是一个四个字节的整数 ,把类型转换为int指针类型 这部分涉及到了类型转换
*(int *)((char*) ptr + 8) = 748100;
//上述写的就是索引的本质,数组的原理
std::cout << "数组的值被指针运算重写为" << example[2] << std::endl;
std::cin.get();
}
在heap上面添加数组 ,此种数组大小不可测
void heapArrays()//在堆上创建数组
{
//int 类型指针数组another。
//在堆上创建,和栈上面生存周期不同 。栈上面生存周期是其作用域结束而结束。堆上面,直至程序将其销毁前一直处于活动状态
//需要使用delete关键字进行删除
//在堆而不是栈上面创建的最大原因是生存期
int* another = new int[5];
for (int i = 0; i < 5; i++)
{
another[i] = 2;
}
delete[] another;
}
C++11有更加安全的数组形式
但是原始数组也可以用。新的数组形式,也许会在后面用到
#include <array>
std::array<int, 5> anothers;//有边界检查,更加安全之类的