C++的一维数组

C++的一维数组

在超市中每件商品都有它们自己的价格,这些价格可以相等也可以不相等,这些一个个价格就是一个个单独的数据,但是有一天超市的老板要对一些价格进行调整或者是要看到超市里面的所有或一部分商品的价格,那这是必定要统计和收集,进而放进一个表格中提供给老板,而在C++中也有与现实中类似的“表格”,也就是这篇文章所要介绍的 一维数组。
当然也有二维、三位…多维数组,在本章现讲一维,二维和三维会发布在我的博客中

在C++中对数组的描述是:数组是一组在内存中依次连续存放的具有统一类型的数据变量所组成的集合体。
其中在数组中的每一个变量都叫做数组元素,并且都是同一种数据类型。
/*************
数组的定义格式:

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

具体例子如下:

	//定义一个保存十个数据的数组
	int a[10];

例子分析:在这里定义了一个保存int类型数据的整型数组,数组名是a,而且数组命名遵循C++的命名规则,[]是用来标识命名的是数组,[]里面的常量表达式的值就是该数组的长度为10,即能存下是个整型数据。
需要注意的是:

  1. 数组元素的类型可以是除了void型以外的任何一种类型,也可以是用户已经定义的构造数据类型;
  2. 数组名是有用户定义,而且数组名可用来代表数组元素的起始地址,且是一个地址常量;
  3. 数组定义时,[]中的常量表达式的值必须是unsigned int 类型的正整数,而且必须是常量否则会报错定义常量用关键字const(如:const int a=10;定义了常量a);常量表达式的值表示数组的大小或者说是长度,也就是能存的数组元素的数量;
    而且数组的定义除了[]与普通类型(如:int double 等类型)不同外,其他都类似,如例子:
#include<iostream>
using namespace std;

int main() {
    
    
	//定义一个保存十个数据的数组a和一个保存三个数据的数组b
	int a[10],b[3];
	
	//定义两个变量c,d
	int c=10, d=3;
	//定义一个保存5个元素的int类型数组e和一个int变量n
	int e[5], n = 1;
	//类似地
	int m = 2, q[3];
}

例子分析:在定义两个数组a[10],b[3],就像定义两个int类型的c,d变量一样,可以连续定义。也可以两个同类型(如:同int类型)的,也可以同时定义。
/****/
有时候在一些程序中可能会需要查询一个数组的大小,这样才能防止数据过多地存放进去,所以有一套计算数组大小的公式:

#include<iostream>
using namespace std;

int main() {
    
    
	//定义一个保存十个数据的数组a和一个保存三个数据的数组b
	const int i = 10;
	int a[i];
	int length = sizeof(a) / sizeof(a[0]);
	cout << "sizeof(a)=" << sizeof(a)<< endl;
	cout << "sizeof(a[0])=" << sizeof(a[0]) << endl;
	cout << length << endl;
}

输出结果:在这里插入图片描述

例子分析:const定义常量,sizeof()函数是得到该数据所占内存大小,sizeof(a)先得到整个数组所占内存的大小,因为数组a是由十个int类型的元素组成,所以该数组占的内存的大小就是(元素总数)*(元素类型所占的内存大小);sizeof(a[0]) 其中a[0]就表示从a数组中取出第一个元素,0是第一个元素的索引值,第二个的索引值是1,之后的元素就以此类推,取出第一个值后就相当于把这个值放在sizeof()的小括号中,然后识别出该值的类型,然后sizeof()函数就返回该类型在内存中占的内存大小,因为是int类型,int类型占的内存大小为4(当然在其他一些编译器或者系统里面可能不一样)所以sizeof(a[0])返回的值是一个元素所占的内存大小,又因为数组里面的元素的类型都是一样的,所以(元素个数)=(整个数组占的内存大小)/(一个元素占的内存),(补充一下:以为每个元素的类型都是一样的,所以sizeof()的小括号中可以是a[1]、a[2]、…),由(数组所占内存的大小)=(数组个数)乘以(每个元素所占的内存大小),所以还可以这样计算一个数组所占的内存大小:n乘以(每个元素所占内存大小)。
/
数组的初始化:
用初值表进行初始化:

int a[5] = {
    
     1,2,3,4,5 };

{初值1,初值2,…,初值n}就是初值表,各个初值用逗号隔开,初值可以是一个变量表达式,而且初值n不能超过数组的大小;如果初值的个数小于数组可以存下的元素数量,则余下部分用零补上(其他类型也一样,如char类型也一样,但是0在字符中表示空,具体可以查ASCII码表)
在初始化的时候[]里面也可以什么也不填,在用初值表初始化的时候,初值表里面的初值个数就是数组所能存下的元素个数。而在函数中定义数组时,如果没有给出初值表时,数组元素的值为随机值;当在函数外定义数组时,如果没有初始化,其数组元素的值为0。初始表可以逗号结尾,这和没有逗号结尾的效果一样。
/
一维数组中元素的存取:
一维数组存取操作有两种:一是存取数组元素;二是读取数组元素的地址;
一、数组元素的读取是通过数组名和下标(索引值)来获取元素:

#include<iostream>
using namespace std;

int main() {
    
    
	int a[5] = {
    
     1,2,3,4,5, };
	cout << a[3] << endl;
}

输出:
在这里插入图片描述结果是取得第四个元素。
二、数组的元素通过数组名来读取,格式:数组名+整型表达式
由于其地址不是实际的地址值,称这个地址表达式为符号地址表达式。例如一维数组元素a[4]的符号地址表达式为a+4。
a是一个int型数组,数组的符号地址表达式a+n所表达的地址是第n+1个元素a[n]的地址,代表的实际地址为:a+nsizeof(int)* 而不是a+n。
在使用数组的时候应注意:
(1),使用数组的时候最容易犯的错误就是数组元素越界,包括上标越界和下标越界。上标越界是指数组元素的访问地址超过了数组的起始地址;下标越界指的是数组元素的访问地址越过了数组中最后一个数组元素的地址。对于这种错误,编译器可能无法得知,往往在运行时出错,因此必须小心。
(2),数组名是一个地址常量,不能当做左值(即赋值的目标),因此不可以将一个数组赋值给另一个数组。
如:

int c[3], d[3];
	c = d;//错误

正确的方法应该是将对应的元素进行复制。
如:

for (int i = 0; i < 3; i++)
	{
    
    
		c[i] = d[i];//把d数组的元素复制到c数组中。
	}

还可以用memcpy()函数进行内存字节复制,其使用格式如下:

memcpy(目标地址, 源地址, 字节数n);

其作用是,把源地址开始的n个字节复制到目标地址中。
把d数组复制到c数组中:

memcpy(c, d, sizeof(d));

但是使用memcpy时要包含文件头 cstring 。
在使用memcpy()函数时就体现了,把数组地址传递时,数组名就是数组的起始地址。
在数组中每个元素的地址是连续的,用&标识符取得地址。
如:

int a[3] = {
    
     1,2,3 };
cout << "a[0]的地址:" <<&a[0] << endl;
cout << "a[1]的地址:" << &a[1] << endl;
cout << "a[2]的地址:" << &a[2] << endl;

在这里插入图片描述计算机中地址输出为十六进制,而且可以明显地看出,元素的地址是连续的,而且相邻的相差sizeof(a[0])。
(以上便是一维数组的基本内容,能看到这里我愿称你为最强。若有异议可以在评论区中提出,二维数组内容我会继续发布)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42107431/article/details/109403980