指针学习 3

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


1)在定义数组时,编译器必须分布足够的存储空间,以存储数组的所有元素。
2)数组的基地址是在内存中存储数组的起始位置,它是数组中第一个元素,即下标为0的数组的地址。


结论:
1)数组名本身是一个地址,也就是一个指针值。
2)数组与指针相同之处:在访问内存方面,数组与指针几乎是相同的。
3)数组与指针区别之处:指针是以地址作为值的变量,数组名的值是一个特殊的固定地址,是指针常量。


例如给出以下定义:
int a[100], *p;
//系统分别把编号3000、3002、3004……作为数组元素a[0]、a[1]、a[2]……的地址(假设int变量为2个字节)
那么内存位置为3000是数组a的基地址,也是a[0]的地址。

如下:
p = a ;
p = &a[0] ;
两条语句是等价的,它们都把3000这个地址赋给了指针p。

又如下:
p = a + 1 ;
p = &a[1] ;
这两条语句也是等价的,它们都把3002赋给了指针p。


注意:

1)指针和数组虽然都能处理同样的问题,但它们有一个本质的不同:
数组a是指针常量,不是变量,因此a++、a = p、a += 2 这样的语句是非法的,不能改变指针常量的值。

2)指针每一次加1或减1的时候,改变的不是指针的值,而是加上或减去指针所指向变量数据类型的长度,
即指向所指向变量的存储单元所占用的字节数。所以像p--、p + i、p += i 这样的表达式都是有意义的。

数组求和时,p = a 即指针p 指向数组a的第一个元素a[0]的地址,累加*p(即a[0]的值),然后p + 1 ,指向下一个元素a[1],再重复操作,直至最后一个元素的地址为止。通过指针p的值有规律的变化让它依次指向每一个数组元素,再用*p取出相应元素的值进行处理。

例:输入正整数n(n<=10),再输入n个整数作为数组元素,分别用数组和指针来计算并输出它们的和。
代码如下:

#include <stdio.h>
int main(void)
{
	int i,n,m,sum;
	int a[10];
	int *p;
	
	scanf("%d",&n);
	for(i = 0;i < n;i++){
		scanf("%d",&a[i]);
	}
	
	sum = 0;
	for(i = 0;i < n;i++){
		sum = sum + a[i];
	}
	printf("%d\n",sum);
	
	sum = 0;
	for(p = a;p < a+n;p++){
		sum = sum + *p;
	}
	printf("%d\n",sum);
	
	return 0;
}

运行结果如下:

 以下总结数组元素求和的三种方法:

int a[MAXN]
int i,n;
int sum = 0;
for(i = 0;i < n;i++){
    sum = sum + a[i];
}
int a[MAXN];
int i,n,sum = 0;
int *p;
for(p = a;p <= a+n;p++){
    sum = sum + *p;
}
int a[MAXN];
int i,sum = 0;
int *p;
p = a;
for(i = 0;i < n;i++){
    sum = sum + p[i];
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值