
1、C89,C90标准是定义数组时下标只允许使用整型,字符型常量;
2、引用数组时下标可以使用整型,字符型的常量或者变量;
3、C99标准是定义数组时下标可以使用整型,字符型的常量或变量,但变量必须已经赋值;
4、引用数组时下标可以使用整型,字符型的常量或者变量,以上所说的常量及变量均包含表达式。
以下标引用的方式访问数组
在使用数组的场合中,我们常见的一种访问方法是使用下标访问数组元素,如:array[2] = 1,此语句是将该数组的第三个元素赋值为1[ ]符号中的数字可以认为是在数组基地址上的偏移量,可以通过改变这个偏移量来访问整个数组。
2以指针访问的方式访问数组
除了使用偏移量的方法,我们还可以使用指针的方法来访问数组,即间接引用的方式。如:(array+2) = 1,同上面的代码一样,也是对该数组的第三个元素进行赋值。
3下标引用和指针访问的执行效率问题
对于这两种不同的访问数组的方式,它们的执行效率也不同,在这里先给出结论:指针访问的效率 >= 下标引用的效率。接下来我们来说说,为什么使用指针进行间接访问的效率会优于小标引用的效率。
下标引用的效率
现在假设有如下代码,执行对整个数组的初始化过程:
int array[10];
for(int i = 0;i < 10;i++)
{
array[i] = 0;
}
在这里我们还是假设编译器中int类型占4个字节,在执行array[i] = 0时,编译器会将其转化为类似(array + (i4)) = 0形式。在整个执行10次的循环中,意味着也进行了10次乘法运算 *** 作和10次加法运算 *** 作。
指针访问的效率
假设有如下代码,执行对整个数组的初始化过程:
int array[10];
for(int ptr = array; ptr < array+10; ptr++)
{
ptr = 0;
}
这里是将指针一开始指向数组首地址,然后每次向后移动一个数组元素,这里是每次移动4个字节,即每次对指针地址+4。在整个过程中只进行了10次加法运算。同上对比可得,对于数组 *** 作来说,指针访问的效率是优于下标引用的。
4下标引用和指针访问的优先级问题
关于这个问题,笔者还是先给出结论,再举例进行阐述。
结论:下标引用优先级 > 指针访问优先级。
假设我们现在有以下两个数组的声明:
int array1[10];
int (array2)[10];
关于上述声明,乍一看很容易混淆,但其实这只是一个关于结合优先级的问题。在看这些声明时,需要记住下标优先级高于指针,并且如果出现了( ),那么它的优先级一定是最高的。
int array1[10]
在和[ ]同时出现的时候,我们先结合优先级高的[ ]来看,即它先声明了一个含有10个元素的数组array1,然后将剩下的int 组合,可以知道这个数组里面的每个元素,都是一个指向整型类型的指针变量。也就是说,这是一个含有10个指针变量的指针数组。
int (array2)[10]
这里的声明中出现了( ),由于( )的优先级最高,所以我们先看(array2),即array2是一个指向某种类型的指针变量。再结合剩下的int [10],可以知道这个指针变量指向的数据类型是含有10个元素的整型数组。也就是说,这是一个数组指针,指向一个10元素整型数组。
一定要用模板吗?
对于结构体元素查找,可能会用到根据其中几个元素来比较,或者所有元素来比较
所以最好可以专门写函数来查找
比如
int find(struct stu array, int value)
{
int i;
for(i=0;i<length;i++)//这个length可以通过全局变量 也可以改成从参数传过来
if(array[i]m == value) break;
return i;
}
这个是查找m的
如果对于结构体查找的元素是固定的,比如值查找m,或者只有当所有元素值相等时才算找到
可以重载 *** 作符==
可以通过下标来获取值,但是C语言不执行数组边界的有效性检查,发现如果数组下标越界了,那么它会自动接着那块内存往后写。
最早的C编译器并不检查下标,而最新的编译器依然不对它进行检查。这项任务之所以很困难,是因为下标引用可以作为任意的指针,而不仅仅是数组名。
作用于指针的下标引用的有效性既依赖于该指针当时恰好指向什么内容,也依赖于下标的值。结果,C的下标检查所涉及的开销比你开始想象的要多。编译器必须在程序中插入指令,证实下标的结果所引用的元素和指针表达式所指向的元素属于同一个数组。这个比较 *** 作需要程序中所有数组的位置和长度方面的信息,这将占用一些空间。当程序运行时,这些信息必须进行更新,以反映自动和动态分配的数组,这又将占用一定的时间。因此,即使是那些提供了下标检查的编译器通常也会提供一些开关,允许你去掉下标检查。
在C语言中,数组就是指针,他只保存了地址。这就造成无法检查是否越界,但也给指针和数组的交互 *** 作提供极大的便利性。
C 的数组根本就是一个指针的语法trick而已。 a[3] 就是 (a+3),而此时a 就是一个地址,当然没有所谓边界限制。a[3] 等效于(a+3)等效于(3+a)
等效于3[a];
求最后数组最后一位可以用sizeof函数
如果是a[10]的就是:
解释就是直接用sizeof检查数组a的内存大小(以字节为单位),减去1(因为数组是从0开始)就可以得到数组最后一个值。
所以,i=sizeof(数组名)/sizeof(数组类型) -1;
<c:forEach var="o" items="${orders}" varStatus="st"> 当前迭代的元素:${oord_code} <!--迭代状态的信息--> 当前迭代的元素:${stcurrentord_code} 当前迭代的索引:${stindex} 迭代计数:${stcount} 是否是第一次迭代:${stfirst} 是否是最后次迭代:${stlast} </c:forEach>
以上就是关于C语言中数组元素下标的数据类型全部的内容,包括:C语言中数组元素下标的数据类型、在C语言中,用下标如何访问数组元素、急求!!!在C++中,如何查找一个结构体数组中的元素并返回其下标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)