C++学习笔记(十六):c++数组

  • 数组在各类型编程语言中都是非常常用的一种数据类型。在学习c++数组之前,一定要学习指针相关的指针,指针是c++数组工作的基本方式。数组是指相同类型的集合,我们经常需要通过某种方式表示很多相同类型的数据集合,此时数组就显得非常有用。
#include

int main()
{
	//数组定义
	int examples[5];   //定义一个长度为5,数据类型为int的数组
	examples[0] = 10;  //给定义好的数组的第一个元素复制,数组的下标是重0开始的
	std::cout << examples[0] << std::endl; //打印数组的第一个元素
	std::cout << examples << std::endl;    //打印数组的地址

	//examples[5] = 3;  //数组越界,访问了不属于给定义数组分配的内存,在Debug模式下程序会崩溃,但在release模式下,可能得不到报错信息,因为该操作将3写入了未知的内存中
	//为确保自己的数组没有因越界导致的内存溢出,可以在对数组的操作加入边界检查

	//可以通过for循环便利数组
	for (int i = 0; i < 5; i++)
	{
		examples[i] = 10;  //将数组的每个元素赋值为10
	}

	std::cin.get();
	return 0;
}
  • 在std::cin.get();行打断点,运行上述程序,可以看到,在内存中数组examples是一块连续的地址,总共20个字节,因为数组的类型是int,在c++中int类型的值一般是4个字节,数组总共包含总结5个int类型的值。
  • C++学习笔记(十六):c++数组_第1张图片
  • c++中对数组的操作,实际上就是对指针的操作,如我们对数组的第三个变量赋值,examples[2] = 5;实际的操作是先取到数据的首地址,然后对该地址偏移8个字节,在将整数5写入偏移后的地址中。该操作如下图所示:
  • C++学习笔记(十六):c++数组_第2张图片
  • 这里的+2,并不是指加两个字节,当处理指针运算时,通过在指针上加2,来计算实际的偏移时,偏移的位置取决于指针的类型,由于本示例中定义的str指针时int类型的指针,所以每次加1,相当于偏移4个字节。
  • 还可以通过new操作在堆上创建一个数组:
#include

int main()
{
	//数组定义
	int examples[5];   //定义一个长度为5,数据类型为int的数组
	for (int  i = 0; i < 5; i++)
	{
		examples[i] = 5;
	}
	int* another = new int[5];  //在堆上创建数组
	for (int i = 0; i < 5; i++)
	{
		another[i] = 5;
	}
	delete[] another;  //通过new创建的数组,需要手动delete,释放内存
	std::cin.get();
	return 0;
}
  • 在堆上创建数组和在栈上创建数组的区别时所创建数组的生存周期不同,如果有可能,尽量将数组创建在栈上, 因为创建在堆上,会产生间接寻址,从而影响性能,如下图,对Entity实例e取地址,得到的时一串地址,再查看得到的地址,才能看到数组的内容5
  • C++学习笔记(十六):c++数组_第3张图片
  • C++学习笔记(十六):c++数组_第4张图片
  • 如果Entity中的数组直接创建在栈中,则对Entity实体e取地址,可以直接得到数组的内容,如下图所示:
  • C++学习笔记(十六):c++数组_第5张图片

你可能感兴趣的:(c++,学习,笔记)