for循环小技巧,遍历数组的时候要使用恰当

本文探讨了在并发环境下使用数组遍历时,两种不同遍历模式的效率与安全性的对比。第一种模式虽然直观易懂,但在数组长度变动时可能导致IndexOutOfBoundsException异常;而第二种模式则通过提前计算数组长度避免了此问题,但在频繁变动的情况下可能影响效率。文章旨在帮助开发者权衡效率与安全性,选择最合适的方法。

基本两种模式

模式一:

for(int i=0;i<list.size();i++){
/*
****some code******
*/
}

这种模式,基本是所有人最习惯的。因为老师就是这么教的……


模式二:


for(int i=0,length = list.size();i<length;i++){
/*
****some code******
*/
}

经常逛IT类的论坛和博客的人,或者那种对代码有洁癖的是会非常推荐第二种……因为第一种方式,没循环一边就会执行一次  list.size()方法。对那些非常注重效率的人来说非常推荐第二种。


但是,今天遇到一个问题:如果用第二种方法便利数组,的确会带来效率的提高。但是如果在并发开发中,数组的长度变换了,可能会带来 IndexOutOfBoundsException 异常。所以效率高的不一定是最好的,要找到合适的才是最重要的。




### 使用指针操作数的方法 在 C 语言中,指针是一种非常强大的工具,可以用来高效地访问和操作数中的元素。通过指针可以直接定位到数的某个位置,并对其进行读取或修改。 #### 基本概念 数名本质上是一个指向其第一个元素的常量指针。因此,可以通过定义一个与数类型相同的指针变量来操作数。例如,在声明 `int arr[5];` 后,可以用 `int *ptr = arr;` 将指针初始化为指向数的第一个元素[^1]。 --- #### 历数 下面展示了一个简单的例子,说明如何使用指针历整个数: ```c #include <stdio.h> int main() { int arr[] = {10, 20, 30, 40, 50}; int *start = arr; // 指向数的第一个元素 int *end = &arr[4]; // 指向数的最后一个元素 int *ptr; for (ptr = start; ptr <= end; ptr++) { printf("当前指针指向的值: %d\n", *ptr); } return 0; } ``` 上述代码展示了如何利用指针从头至尾依次访问数中的每一个元素。每次循环都会使指针向前移动一位(即增加地址偏移),并通过解引用运算符 `*` 获取该位置存储的实际数值。 --- #### 插入数据到已排序数 另一个常见的应用场景是对有序数插入新元素。以下是实现这一功能的一个具体实例: ```c #include<stdio.h> int main(){ int a[11]={10,20,30,40,50,60,70,80,90,99}; int *p; p=a; int m,i,j,t,k; scanf("%d",&m); // 输入要插入的新数据 k=a[9]; if(m>=k){ a[10]=m; // 如果大于等于最大值,则直接放在最后面 } else{ for(i=0;i<11;i++){ if(*(p+i)>m){ // 找到合适的位置停止查找 break; } } for(j=11;j>i;j--){ // 把后面的元素逐个后移腾出空间 *(p+j)=*(p+j-1); } *(p+i)=m; // 放置新的数据项 } for(i=0;i<11;i++){ // 输出最终的结果序列 printf("%d ",a[i]); } return 0; } ``` 此程序允许用户输入一个新的整数,并将其正确地插入到已经升序排列好的一维数之中[^4]。它首先判断目标值是否应位于末端;如果不是的话,则会找到恰当索引处停下,并执行必要的位移调整动作后再完成赋值过程。 --- #### 处理多维数 当涉及到二维甚至更高维度的情况时,同样也可以借助于指针来进行处理。不过需要注意的是此时每个子集本身也是一个单独的一级结构体对象而已。比如对于给定大小固定的矩阵形式来说我们可以这样写法: 假设我们有一个三维表单表示如下所示: ``` [[1 2 3], [4 5 6]] ``` 那么对应的内存布局将是连续线性的区块分配方式——也就是所谓的“行优先”模式下展开后的样子。所以当我们想要获取某特定单元格内的信息时候只需要简单计算一下相对基址即可得到确切的目标地址表达式了[^5]。 --- ### 总结 综上所述,C 中运用指针对数的操作不仅限于基本类型的单一列表管理方面还包括复杂嵌套型态下的灵活控制手段。掌握这些技巧有助于编写更加紧凑高效的算法解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值