[C语言] 指针在数组求和中的使用

指针、数组和地址之间的关系

在定义数组时,编译器必须分配基地址和足够的存储空间,以存储数组的所有元素。数组的基地址是在内存中存储数组的起始位置,是数组中第一个元素(下标为0)的地址,因此数组名本身是一个地址即指针值。在访问内存方面,指针和数组几乎相同,区别在于:指针是以地址作为值的变量,而数组名的值是一个特殊的固定地址,可以看作常量指针。

假设给出定义int a[100], *p;,系统将编号为3000,3002,3004,…的内存字节作为数组元素a[0],a[1],a[2],…,a[99]的地址(假定系统int型变量的长度为2个字节),那么其中内存位置3000是数组a的基地址,也是a[0]的地址。

于是p=a;p=&a[0];是等价的,p=a+1;p=&a[1];亦是等价的。

数组和指针之间的关系如下图:

指针内存地址内存单元数组元素
p3000a[0]
p+13002a[1]
p+i3000+2ia[i]
p+993198a[99]

对数组元素求和

如果已经对数组a进行了赋值,以下语句对数组元素求和:

	sum = 0;
	for (p = a; p <= a[99]; p++)
		sum += *p;

在循环中,指针变量p的初值是数组a的基地址,p连续取值&a[0],&a[1],…,&a[99]。

一般而言,如果iint型变量,那么p+i就是距地址p的第i个偏移,类似地,a+i是距数组a的基地址的第i个偏移,*(a+i)a[i]等价。于是有第二种求和方式:

	sum = 0;
	for (i = 0; i < 100; i++)
		sum += *(a + i);

正如*(a+i)a[i]等价一样,*(p+i)p[i]等价。于是有第三种求和方式:

	p = a;
	sum = 0;
	for (i = 0; i < 100; ++i)
		sum += p[i];

下面给出分别使用数组和指针计算数组元素之和的代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main() {
	int i, a[10], * p;
	long sum = 0;

	printf("Enter 10 integers:");
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);

	for (i = 0; i < 10; i++)
		sum = sum + a[i];
	printf("calculated by array, sum=%ld\n", sum);

	sum = 0;
	for (p = a; p <= a + 9; p++)
		sum = sum + *p;
	printf("calculated by pointer, sum=%ld\n", sum);

	return 0;
}

结果如下:
在这里插入图片描述

数组名作为函数的参数

针对代码:

int sum(int a[], int n) //int a[]等价于int *a
{
	int i, s = 0;
	for (i = 0; i < n; ++i)
		s += a[i];
	return s;
}

数组形参a实际上是一个指针,当进行参数传递时,主函数传递的是数组a的基地址,数组元素本身不被复制。

假定定义数组int b[100],在对其赋值之后,可以调用函数sum()b中的元素作累加。

调用被计算和被返回的内容
sum(b, 100)b[0] + b[1] + … + b[99]
sum(b, 88)b[0] + b[1] + … + b[87]
sum(&b[7], k-7)b[7] + b[8] + … + b[k-1]
sum(b+7, 2*k)b[7] + b[8] + … + b[2*k+6]
  • 15
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值