浅谈C语言——难点重点区(2)

数组(二)

指针和数组:C语言中指针和数组关系是非常紧密的,它能使我们深入了解C语言的设计过程,并且能够帮助我们理解现有的程序。

本文章参考《C语言程序设计现代方法(第二版)》以及自己总结,不正确或者不适当的地方欢迎批评指正,主要以学习总结以及应用为主,在深入学习的同时也会及时更正不适合的地方。

大约需要15分钟进行阅读和理解。

关于上一节的简单运算:

/***********基础运算比较***/
#include<stdio.h>

int main()
{
	int *p,*q,i,a[i];
	
	scanf("%d%d",&a[2],&a[4]);
	
	p=&a[2];//p所表示*p,即表示地址的内容 
	q=&a[4];
	printf("%d\n",p);//这里的输出p表示地址 
	printf("%d\n",q);
	printf("%d\n",*p);
	printf("%d\n",*q);
	printf("%d\n",p-q);//地址之差 
	printf("%d\n",q-p);
	printf("%d\n",*p-*q);//地址内容之差 
	printf("%d\n",*q-*p);

	return 0;
}

在这里插入图片描述

一、 指针的算术运算

1、 C语言支持三种格式的指针算数运算

  • 指针加整数
  • 指针减整数
  • 两个指针相减

假设a[ j ],a[ i + j ] ,a[ i - j ]均存在;
如果p指向数组元素a[ j ],那么p+j指向a[ i + j ]; 如果p指向数组元素a[ j ],那么p-j指向a[ i - j ];
当两个指针相减时,结果为指针之间的距离(用数组元素个数度量),因此,如果p指向a[ i ]且q指向a[ j ],那么p - q就等于i – j。
2、 指针用于数组处理
指针的算术运算允许通过对指针变量进行重复自增来访问数组的元素。
来说一个小例子来引出下边:
int *p = (int [] ) { 3, 0, 3, 4, 1};
p指向一个五元数组的第一个元素,这个元素包括3, 0, 3, 4, 1。使用复合字面量可以减少一些麻烦,我们不再需要先声明一个数组变量,然后用指针p指向数组的第一个元素:

int a[ ] = { 3, 0, 3, 4, 1};
int *p = &a[ 0 ];
/*****数组指针结合计算******/ 
#include<stdio.h>
#define N 5

int main()
{
	int *p;
	int sum=0;
	int a[N]={1,2,3,4,5};
	
	for(p=&a[0];p<&a[N];p++)
	{
		sum+= *p;
		printf("%5d\n",sum);
	}
	
	printf("%d\n",sum);
	return 0;
}

在这里插入图片描述
解析:
首先,宏定义了一个N且为5;a[ N ]:表示在一个数组中有0到N-1个元素。
当p取到了a[0]地址,a[0]地址比a[N]地址小,只要符合条件的一直执行,一直到地址a[N]时,结束运行,所有sum+= p;中的p取其内容,相加的结果。
(for语句中的条件p<&a[N]:尽管a[N]不存在,但是是合法的,不会尝试a[N]的值的,所以说是比较安全的)

3、“*”运算符和++运算符组和

在这里插入图片描述

二、 用数组名作为指针

指针的算数运算时数组和指针之间相互关联的一种方法,但这不是两者唯一的联系,下面来说一种另一种关系:可以用数组的名字作为指向数组第一个元素的指针。
假设

 int a[10];

用a作为指向数组的第一个元素的指针,可以修改a[0]:

*a = 7;

可以通过指针a + 1来修改a[1]:

*(a+1) = 12;

通常情况下,a+i等同于&a[i],也可以用a替换&a[0],用a+N替换&a[N].
下面运用这种情况写一段小程序:

/** * *数组指针结合* * 

 * * *正序输入* * *
 * * *倒序输出* * * 

*******************/ 
#include<stdio.h>
#define N 5

int main()
{
	int a[N], *p;
	printf("输入\n");
	for(p=a;p<a+N;p++)
	scanf("%d",&*p);
	  
	 
	 printf("倒序输出\n");
	 for(p=a+N-1;p>=a;p--)
	 printf("%4d",*p);
	return 0;
}

在这里插入图片描述
分步解析得:
输入:
p =a[0] , a[0]<a[0]+N 写一个
p=a[0]+1 , a[0]+1<a[0]+N 写一个
p=a[0]+1+1 , a[0]+1+1<a[0]+N 写一个
p= a[0]+1+1+1, a[0]+1+1+1<a[0]+N 写一个
p= a[0]+1+1+1+1 , a[0]+1+1+1+1<a[0]+N 写一个
p= a[0]+1+1+1+1+1= a[0]+N ,a[0]+N=[0]+N 不写结束

输出:
p=a[0]+ 1+1+1+1 , a[0]+ 1+1+1+1 >=a[0] , 输出p= a[0]+1+1+1+1地址所代表的内容
p=a[0]+ 1+1+1 , a[0]+1+1+1>=a[0] , 输出p=a[0]+ 1+1+1地址所代表的内容
p=a[0]+1+1 , a[0]+1+1>=a[0] , 输出p=a[0]+1+1地址所代表的内容
p=a[0]+1 , a[0]+1>=a[0] , 输出p=a[0]+1地址所代表的内容
p=a[0] , p=a[0]=a[0] , 输出p=a[0]地址所代表的内容

好了,就到这里了,数组和指针的基础知识基本已经完结了,这一块虽然不好理解,那不还是一样过来了吗,一定不要放弃,要用于面对难题,大家一起加油,加油干!!!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值