用指针对二维数组进行计算

学习到数组与指针...感觉指针确实是c最让人头痛的地方.

在处理数组时实际上就是使用指针,但是在编写这样的函数时,可以选择使用数组表示法还是指针表示法.

一维数组相对较为容易理解,因为只需要一次解引用,在函数中计算或者或者声明形参时,用 *数组名.

如如下函数的定义int sump( int * start, int *end),

给形式参数传值时,只需要传数组名即可.例如sump(数组名,数组名+数组长度);

在计算要求数组总和时, 可以用如下代码表示

while(start < end)

{

total += *start++;

}

在上述代码中,因为while循环吃的测试条件是一个不相等的关系,所以循环最后处理的一个元素

是end所指向位置的前一个元素.这意味着end指向的位置实际上在数组最后一个元素后面,.

C保证在给数组分配空间时,指向数组后面第一个位置的指针仍是一个有效的指针.这使得while循环的

测试条件是有效的.使用这种"越界"指针的函数调用更为简洁.

sump(array, array+SIZE);

因为从下标0开始,所以array+SIZE指向数组末尾的下一个位置.如果end只想数组的最后一个元素而不是数组末尾的下一个元素

则必须使用如下代码,

sump(array, array+SIZE-1);

但在使用多维数组的时候,就不能像一维数组那样轻松的使用解引用符号了 请看如下代码

#define MONTHS 12
#define YEARS 5
//float sum_year( float **rain, int year);
//void sum_month( float **rain, int year);
//以上两个函数原型是错误的,如需要使用自定义函数来计算
//可以使用如下原型 float sum_year(float (*rain)[MONTHS],int year)
int main(void)
{
	float subtot;
	float total;
	int month;
	int year;
	const float rain[YEARS][MONTHS] = 
	{
		{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
		{8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
		{9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
		{7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
		{7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
	};
	const float (*pt)[MONTHS];
	pt = rain;
	printf("  Year	RAINFALL (inches)\n");
	
	for(year = 0, total = 0; year < YEARS; year++)
	{
		for(month = 0, subtot = 0; month < MONTHS; month++)
		{
			subtot += *(*(pt+year)+month);
		}
		total += subtot;
		printf("%6d %12.1f\n", 2010+year, subtot);
	}
	printf("\nThe yearly average is %.1f inches .\n\n", total/ YEARS);
	printf("MONTHLY AVERAGES:\n\n");
	printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct ");
	printf("Nov Dec\n");
	for(month = 0; month < MONTHS; month++)
	{
		for(year = 0, subtot= 0; year<YEARS; year++)
		{
			subtot += *(*(pt+year)+month);
		}
		printf("%3.1f ", subtot /YEARS);
	}
	return 0;
}
以上代码是求使用指针来计算数组的的总和以及其每列的平均值.

在二维数组中,不能直接使用双重解引用符号来定义指针变量.

需要让编译器知道数组所指向的对象大小.



### LabVIEW 中二维数组计算方法 LabVIEW 提供了丰富的函数库来支持多维度数据的操作,特别是对于二维数组的处理。为了实现高效的二维数组运算,在设计程序时应考虑优化策略以提升性能并减少资源消耗。 #### 使用内置函数进行基本操作 LabVIEW 自带了许多用于矩阵和数组操作的功能模块,可以直接用来完成加法、减法、乘法等基础运算。例如: ```labview // 加载两个相同大小的二维数组 A 和 B 到前面板控件中 Array Add = Array Addition(A, B); // 对应位置相加得到新的二维数组 C=A+B ``` #### 高效的大规模数据处理技巧 针对大规模的数据集,采用特定的技术手段能够显著改善执行效率。这包括但不限于预分配足够的存储空间给目标变量,避免动态调整尺寸带来的额外开销;合理规划循环结构内的索引访问模式,尽可能使相邻元素连续存取从而加快读写速率[^2]。 #### 实现二维卷积算法 当涉及到更复杂的变换如卷积时,则可借鉴已有的理论成果简化流程。具体而言就是把原本复杂度较高的二维卷积拆分成两步独立的一维过程依次实施,这样做的好处是可以大幅度削减所需的浮点数运算次数,进而加速整个计算环节[^3]。 ```labview // 定义输入图像 ImageMatrix 及滤波器 KernelMatrix RowConvolutionResult = Convolve Along Rows(ImageMatrix, KernelMatrix); FinalOutput = Convolve Along Columns(RowConvolutionResult, Transpose(KernelMatrix)); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值