很多朋友对于c语言数组从0开始还是从1开始和为什么有些编程语言的数组要从零开始算不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
c语言数组地址指向首元素吗
C语言数组名,就是数组的首地址.数组的首地址,就是首元素地址.所以C语言数组地址指向首元素是正确的.即inta[N];a的值就是&a[0]
常用的编程语言,数组下标从0和1开始的分别有哪些
国破山河在,城春草木深。
儿童冬学闹比邻,据岸愚懦却子珍。
种豆南山下,草盛豆苗稀。
海内存知己,天涯若比邻。
泉眼无声惜细流,树阴照水爱晴柔,杨柳青青江水平,闻郎江上唱歌声。
山重水复疑无路,柳暗花明又一村。
清江一曲抱村流,长夏江村事亭幽。
c语言数组定义
1、一维数组
定义公式:类型说明符数组名[常量表达式];
注意:常量表达式包括常量与符号常量,不能包含变量。
例如:
inta[5];
charc[3];
上面的示例中,定义了一个int整型数组,数组名为a,定义的数组称为数组a。还定义了一个字符类型的数组,数组名为c,定义的数组称为数组c。
此时数组a中有5个元素,每个元素都是int型变量;数组c中有3个元素,每个元素都是char型变量。
说明:数组名除了表示该数组之外,还表示该数组的首地址。数组中的元素在内存中的地址是连续分配的。
下面我们来看看C语言定义和初始化一维数组的几种形式:
示例1:整型数组的定义和初始化
inta[5]={1,2,3,4,5};
intarr[]={1,2,4};
intarr[10]={1,2};
示例2:字符数组的定义和初始化
charstr1[5]=“hello”;//定义数组长度:30
charstr1[30]={'L','e','t','\'','s','','g','o','\0'};//字符串长度:8;数组长度:30
charstr1[30]="Let'sgo";//字符串长度:8;数组长度:30
charstr2[]="toLondon!";//字符串长度:11(注意开头的空格);数组长度:12
2、二维数组
定义公式:类型说明符数组名[常量表达式][常量表达式];
例如:
inta[3][4];
charc[3][10];
c语言指针数组的用法
一维数组指针
一维数组的指针是直接将一维数组的首地址赋予指针变量,之后通过指针变量的运算逐渐输出一维数组中的各个元素的值。
例如:inta[20];
int*p;
因为数组名相当于一个指针指向的就是一维数组的首地址(例如a[0]),所以可以直接将数组名赋予指针变量(例如p=a),无需加取地址符&;也可以让指针变量指向第一个元素的地址(例如p=&a[0]);即p=a与p=&a[0]是等价的,(应当要注意的是:p=a是将数组首元素的地址赋给指针变量,而非将数组a的各元素的值赋给指针变量)
如果一个指针变量p已经指向数组中的一个元素,则p+1指向数组中的下一个元素,p-1指向的是数组中的上一个元素。(注意:执行P+1或P-1时,并不是将P的值简单的加1,而是加上一个数组元素所占用的字节数,例如:float型,每个元素占4个字节,所以p+1意味着使p的地址加4个字节,以便让其指向下一个元素)
这里的a+i与p+i是等价的,也可以用数组名进行运算;
e
*(a+i)==*(p+i);
二维数组指针
令inta[2][3]={{1,2,3},{4,5,6}}
在二维数组中数组名指向数组的首元素,但是不是简单的表示一个简单的元素,而是由多个元素所组成的一维数组,因此数组名指的是二维数组首行(即下标为0的那一行)的首地址,a+1即表示下标为1的那一行元素,又因为数组名代表首元素的地址,所以a即代表二维数组中a[0][0]的值,a+1即a[1][0]的值。a[0]等价于*(a+0),a[1]等价于*(a+1),(a+1)+1的值即&a[1][1]。要想得到a[1][1]的值,就要再进行取值,即(a[1]+1)或*((a+1)+1)为a[1][1]的值。(注意:(a+i)与a[i]是等价的)
切记二维数组名是指向二维数组首行,而非指向二维数组a[0][0];
二维数组在指向行的指针前加*,就转化为了指向列的指针,反之,在二维数组指向列的指针前加&,就转化为了指向行的指针.(例如:&a[i]或a+i指向行.而a[i]或*(a+i)则指向列)
在定义时的int(*p)[4]的意思是指针变量p指向包含四个整型元素的一维数组,即在二维数组中一共有四行元素
为什么有些编程语言的数组要从零开始算
目前大多数编程语言的数组下标都是从0开始计算的,这可能不符合人们从正整数开始计数的习惯,不过计算机世界里从0开始计数有它的历史原因……什么是数组数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按无序的形式组织起来的一种形式。下图表示了一个长度为10的一维数组在内存中的存储状态。很明显,如果需要访问一个数组的某一个元素,我们通常需要知道它的下标/索引(indice)。如何访问数组元素可以简单理解为,访问数组元素实际上是读取某个内存地址的值。从上图可以看到,数组在内存中是连续的,每个元素占用了同样大小的空间,这样,我们只需要知道数组第1个元素的内存地址,通过加上相应的偏移量,就能拿到某个数组元素的内存地址。先看看如果第1个元素下标是1怎样定位其它元素:我们假设第1个元素的地址(首地址)为a,每个数组元素的大小为s,那么第2个元素下标为2,地址=a+(2-1)*s,第3个元素下标为3,地址=a+(3-2)*s,第n个元素下标为n,地址=a+(n-1)*s。再看看如果第1个元素下标是0是怎样:第2个元素下标为1,地址=a+1*s,第n个元素下标为n-1,地址=a+n*s。比较一下两个式子:第1个元素下标为1:第n个元素地址=a+(n-1)*s第1个元素下标为0:第n个元素地址=a+n*s看出区别了吗?如果用0作为下标,每次在定位元素地址进,少了一次减法运算!为什么要拿0作为第1个元素的下标你可能觉得,下标从1开始计算仅仅多了一次减法运算,可是看一看计算机的发展历史,你会明白为什么在早期的编程语言设计中会那么在意在一次减法运算。从上世纪60年代到今天的近60年间,计算设备的计算能力达到了1T倍(1万亿倍)的增长,过去那些看来相当牛掰的超级计算机,现在却连一台手机甚至一块手表都比不上。从下面的图中可以看到,1985年的Cray-2超级计算机计算能力与一台iPhone4相当,而一只iWatch的计算能力又相当于两台iPhone4。数组是计算机程序中使用非常频繁的一种数据结构,如果每次下标寻址都能节省一次运算,在早期计算机系统中程序的运行速度可能会有非常显著的提高,这样才能充分的利用当时昂贵的计算资源。出于习惯和兼容考虑,现代编程语言也把这一设计思想延续了下来,这也是为什么计算机世界里通常从0开始计数的原因。OK,关于c语言数组从0开始还是从1开始和为什么有些编程语言的数组要从零开始算的内容到此结束了,希望对大家有所帮助。