指针(2)——数组中的指针

     归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
       既然选择了远方,便只顾风雨兼程!

 

目录

引言: 

一、一维数组中的指针:

        题目1:一维整型数组a,有10个元素,输入10个整数储存在数组a中。

方法一:通过取地址运算符求得元素的指针。

方法二:通过数组 0元素的指针 a 加 i求得元素的指针。

方法三:使用指向数组元素的指针变量。

 题目2:一维整型数组a,存储有10个数据,输出数组中的全部数据。

方法一:使用数组元素的下标访问数组元素。

方法二:通过数组的首地址(数组名)访问数组元素。

方法三:通过指向数组元素的指针变量访问数组元素。

二、二维数组中的指针:

1.使用二维数组元素指针访问数组元素

        题目1:有 3 行4 列整型数组 ,存储 12个数据,输出二维数组 的全部数据。

方法一:通过二维数组每行的首地址(x[i])访问二维数组的元素。

方法二:通过指向二维数组元素的指针变量访问二维数组元素。

2.使用二维数组的行指针访问数组元素

方法一: 通过二维数组名,x 访问二维数组的元素。

方法二:通过指向二维数组行的指针变量访问二维数组元素。


引言: 

        由于数组元素在内存中连续存放,知道一个元素的指针,就可以通过加减运算求得其他元素的指针,进而对数组元素进行访问。C 语言规定,一维数组名是一个指针常量,代表数组在内存中的起始地址,准确地说是数组 0 元素的指针

一、一维数组中的指针:

        这里以例子来深入理解指针

        题目1:一维整型数组a,有10个元素,输入10个整数储存在数组a中。

方法一:通过取地址运算符求得元素的指针。

#include<stdio.h>
int main(){
	int a[10],i;
	for(i=0;i<10;i++)
		scanf("%d",&a[i]); /* &a[i]是数组元素a[i]的指针*/
}

方法二:通过数组 0元素的指针 a 加 i求得元素的指针。

#include<stdio.h>
int main(){
	int a[10],i;
	for(i=0;i<10;i++)
		scanf("%d",a+i); /*a+i 是数组元素 a[i]的指针*/
}

方法三:使用指向数组元素的指针变量。

#include<stdio.h>
int main(){
	int a[10],*p;
	p=a;		/*或 p=&a[0];指针变量 p 指向数组元素 a[0]*/
	for(;p<(a+10);p++)
	scanf("%d",p);/*循环过程中,p 的值依次是 a[0]~a[9]的指针*/
}

或者

#include<stdio.h>
int main(){
	int a[10],*p;
	p=&a[0];	
	for(i=0;i<10;i++)
	scanf("%d",p+i);/*循环过程中p 的值不变,p+i是数组元素a[i]的指针*/
}

 题目2:一维整型数组a,存储有10个数据,输出数组中的全部数据。

方法一:使用数组元素的下标访问数组元素。

#include<stdio.h>
int main(){
	int a[10]={0,1,2,3,4,5,6,7,8,9},i;
	for(i=0;i<10;i++)
		printf("%3d",a[i]);/*下标法*/ 
}

方法二:通过数组的首地址(数组名)访问数组元素。

#include<stdio.h>
int main(){
	int a[10]={0,1,2,3,4,5,6,7,8,9},i;
	for(i=0;i<10;i++)
		printf("%3d",*(a+i));/*指针法*/ 
}

方法三:通过指向数组元素的指针变量访问数组元素。

#include<stdio.h>
int main(){
	int a[10]={0,1,2,3,4,5,6,7,8,9},*p;
	p=&a[0];
	for(;p<(a+10);p++)
		printf("%3d",*p);/*指针法*/ 
}

或者

#include<stdio.h>
int main(){
	int a[10]={0,1,2,3,4,5,6,7,8,9},*p,i;
	p=a;
	for(i=0;i<10;i++)
		printf("%3d",*p+i);//或p[i] 
}

        在使用指针变量时,要注意以下几点。
(1) 指针变量可以自增、自减,而数组名不可以自增、自减。
        例如,方法三是用指针变量p 指向数组元素,用 p+使p 的值不断变化,这是合法的如果不用 p++,而用 at+行不行呢? 是不行的。因为 a 是数组名,是数组首地址,它的值在程序运行期间固定不变,是常量。

(2) 注意指针变量的当前值。

        例如,方法三中,指针变量 p 不断变化,依次指向数组每个元素。循环结束时,指针交量p指向哪里呢? 此时,p的值不是&a[],而是&a[10],即指向数组之外的单元了。

(3) 注意防止下标越界。

        例如,方法三中,数组 a 若执行*(p+10)=18,则 18 并不赋给数组元素,而是将 18 赋给元素 a[9]的下一个存储单元,如果这个存储单元原来的数据是程序要使用的重要数据,则上面的赋值操作就将这个重要数据改为 18 了,它很可能使程序产生完全错误的结果。

二、二维数组中的指针:

        二维数组是一维数组的扩展,若一维数组的元素本身又是一个一维数组,则构成二维数组,二维数组中的指针比一维数组要复杂一些。

        在二维数组中有两种指针:1.元素指针,整型元素 x[i][j]的指针&x[i][j]或 x[i]+j。2.行指针,x[0]~x[2]的指针&x[i]或 x+i,数组名x是x[0]的指针,是行指针。对二维数组元素的访问同样也有两种方法: 1.下标法;2.指针法。下标法这里不再赘述

        这里同样以例子理解指针

1.使用二维数组元素指针访问数组元素

        题目1:有 3 行4 列整型数组 ,存储 12个数据,输出二维数组 的全部数据。

方法一:通过二维数组每行的首地址(x[i])访问二维数组的元素。

#include<stdio.h>
int main(){
	int x[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}},i,j;
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%3d",*(x[i]+j)); /* x[i]+j是元素x[iJ[j]的指针*/
		}
		printf("\n");
	}
}

方法二:通过指向二维数组元素的指针变量访问二维数组元素。

#include<stdio.h>
int main(){
	int x[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}},i,j,*p;
	p=&x[0][0];/*或 p=x[0];p 是整型指针变量,不能写:p=x;*/
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%3d",*p++); /* *p++ 与 *(p++)等价 */
		}
		printf("\n");
	}
}

或者

#include<stdio.h>
int main(){
	int x[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}},i,j,*p;
	p=x[0];
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%3d",*(p+i*4+j));  /*p不变,p+i*4+j是x[i][j]的指针*/
		}
		printf("\n");
	}
}

2.使用二维数组的行指针访问数组元素

        &x[i]和x+i是i行4个元素整体所使用内存空间的起始地址,是行指针。这样的指针应存储在指向行的指针变量中,指向行的指针变量定义形式如下:
        类型(*指针变量名)[m];
其中的圆括号不可省略,m 是一个整型常量。定义指向具有 m个元素组成的一维数组整体的指针变量。

        结合一维数组元素的访问方法可知,x+i 是元素 x[i]的指针:*(x+i)是x[i],x[i]+j是元素 x[i][j]的指针,所以*(x+i)+j 是元素 x[i][j]的指针,*(*(x+i)+j)就是数组元素 x[i][j]。切记,行指针前加*,是该行 0元素的指针。

        使用行指针输出例 题目1中二维数组的全部数据

方法一: 通过二维数组名,x 访问二维数组的元素。

#include<stdio.h>
int main(){
	int x[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}},i,j;
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%3d",*(*(x+i)+j));
		}
		printf("\n");
	}
}

方法二:通过指向二维数组行的指针变量访问二维数组元素。

#include<stdio.h>
int main(){
	int x[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}},i,j;
	int (*p)[4];/*定义 p是指向二维数组行的指针变量*/
	p=&x[0];		/*或p=x;p指向0行,不能写:p=x[0];*/
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%3d",*(*p+j));/* *p是p所指的行中 0元素的指针 */
		}
		p++;/* p++ 使p指向下一行 */
		printf("\n");
	}
}

三、总结:

        区分指针与指针所访问的内存空间,指针以及指针指向数组的起始地址只是指向它,但指针所指向的内存空间是在访问它的值具体是多少。

        最后,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。若这篇文章中有哪些不正确的内容,欢迎大家在评论区和我交流讨论!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梵豪

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值