指针是C++中数组的工作方式,没有指针基础可以看笔记6。
数组就是一堆变量的集合,有没有感觉与结构体很相似?
让我们来考虑下在结构体中我们仅仅是定义了几个变量例如定义x,y坐标与speed速度。如果我们需要64个变量表示某个东西的64种状态,那么你会看到
int a0 = 0;
int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = 4;
int a5 = 5;
int a6 = 6;
int a7 = 7;
。
。
。
如此还要到63,可想而知这是没有意义的,所以我们引入数组。
int main()
{
int example[5];
example[0] = 2;
example[4] = 2;
std::cout<<example[0]<<std::endl;
std::cin.get();
}
我们创建一个example数组【5】代表了需要存放5个数,当我们对这五个数赋值时example[0] = 2;
【0】表示第一个数据,example[4] = 2;【4】表示第五个数据。对于数组的索引都是从0开始的因为,对于二进制000->0,001 ->1,010->2,011->3,100->4。我们不可能为了计数而去空闲掉000而从001开始。
数组赋值
那我们对example中五个数都赋值2
int main()
{
int example[5];
example[0] = 2;
example[1] = 2;
example[2] = 2;
example[3] = 2;
example[4] = 2;
std::cout<<example[0]<<std::endl;
std::cin.get();
}
还会出现与之相同的问题,对64个数值赋值怎么办?
我们采用for循环
int main()
{
int example[5];
for(int i = 0;i < 5;i++)
example[i] = 2;
std::cout<<example[0]<<std::endl;
std::cin.get();
}
对于循环将i<5替换成i<=4可不可以呢?可以的,但是<相比于<=计算机的开销更小,省去了判断相等这步,而且执行效果一样没必要使用<=。
还有一件事,对于这个长度为5的数组如果对example[5]或者example[-1]赋值,这就超出了划定为范围,这是极其危险的,因为你不知道超出的位置你改写了什么。
使用memory1对数组的内存视图来看,我们赋值的5个四字节的2,在内存上是连续存放的。
所以当example[1]变到example[2]时,索引加一,内存向后偏移1*sizeof(int)四个字节。
数组与指针
int main()
{
int example[5];
int* ptr = example;
std::cout<<example[0]<<std::endl;
std::cin.get();
}
example实际上在这里就是整型指针,还记得我们说指针就是送货员拿着指针看地址对吧,指针指向一个房子。数组就像是送货员拿着指针看联排别墅,你拿到的指针对应着5栋别墅的第一栋别墅(第0个地址),你将指针加一就指向了第二个别墅(第1个地址)。
所以送货员手里的指针是没有变的,那就意味着我们可以用指针修改数组,就如上述栗子。
我们再对数组内部赋值。
int main()
{
int example[5];
int* ptr = example;
example[2] = 5;
*(ptr+2) == 5;
std::cout<<example[0]<<std::endl;
std::cin.get();
}
我们让ptr指向example实际上指向了,example[0]的地址也就是首地址。
ptr+2代表了第三个整数的地址,*(ptr+2)表示第三个整数的数据。
在栈和堆上创建数组区别
(堆和栈是什么?挖坑~~)
int main()
{
int example[5];
int* Example = new int[5];
std::cout<<example[0]<<std::endl;
std::cin.get();
}
example数组创建在栈上,Example数组创建在堆上。两者实现的效果是一样的我们都可以用for循环将内部五个数都赋值为2,两者的区别是堆上创建的Example只有主动将其删除时才会销毁,就是说堆上的生存时间更长。int example[5];只要跳出函数的花括号就会被销毁, int* Example = new int[5];只有delete [] Example;时才会被销毁。
这就是在栈与堆上创建的数组区别之处。
标签:main,15,int,C++,数组,自学,赋值,example,指针 From: https://blog.csdn.net/weixin_64418869/article/details/140665786