数组指针与指针数组

指针数组

1.什么是指针数组

        指针数组是一个数组,是用于存放指针的,即将指针(所指向的内存地址)作为数组元素的类型,存入的元素为变量或者是常量。

        指针数组存放的是很多指针的集合

2.定义一个指针数组

        格式:数据类型 *指针名 [数组大小]

        例:int *p[5]         长度为5的数组里面存放了5个类型为int* 类型的指针。(如果存入的是字符串常量,则为该常量对应的首地址)

这里可以看到,数组p中存放的是就是变量a、b、c的指针(即地址值),对其解引用当然也可以得到其相应的值。

 数组指针

1.什么是数组指针

                数组指针首先是一个指针,是一个指向数组的指针,可以存放数组的地址

那么什么是数组的地址呢?

        int arr[5]={1,2,3,4,5}

        arr-数组首元素的地址

        &arr[0]-数组首元素的地址

        &arr-数组的地址

即一个数组指针存放的是&arr的地址。

2.定义一个数组指针

        数据类型(*指针名)[数大小]

        例: int (*p)[5]   定义一个int类型的大小为5的数组指针

int main() {
	int arr[5] = { 10,20,30,40,50 };
	
	int(*p)[5];
	p = &arr;
	printf("%p\n",arr);//arr首元素的地址值
	printf("%p\n",&arr[0]);//arr[0]的地址值 
	printf("%p\n",arr[0]);//第一个元素10所对应的地址值
	printf("%p\n",p);//p指针的地址值,
	printf("%p\n",*p);//*p即arr本身的地址值
	printf("%p\n", *p[0]);//*p对应arr,*p[0]对应arr[0]第一个元素10的地址值
	printf("%d\n", (*p)[0]);//指针p第一个元素的值,即arr[0]的值
	int* pa;
	pa = &((*p)[0]);
	printf("%d",*pa);//用指针变量pa接收arr[0]的地址,在解引用验证是否正确
	return 0;
}

指针p存放的是数组arr的地址,p就是数组指针。

数组指针例题:

编写程序,利用指向数组的指针求 3 * 5 数组各行元素之和。

#include<stdio.h>
#define N 3
#define M 5
int main()
{
	int a[N][M];
	int (*p)[M] = a;
	int i,j,sum;
	/********** Begin *********/
	for(i=0;i<N;i++){
		sum=0;
		for(j=0;j<M;j++){
			scanf("%d ",*(p+i)+j);
			// printf("%d ",*(*(p+i)+j));
			sum+=*(*(p+i)+j);
		}
		printf("第%d行和为:%d\n",i,sum);
	}
    /********** End **********/
	return 0;
}

测试输入:54 21 36 58 4 78 46 2 35 47 69 28 91 51 32

结果显示:

 指针数组例题:

编写程序,利用指针数组求 3 * 5 数组各行元素之和。

#include<stdio.h>
#define N 3
#define M 5
int main()
{
	int a[N][M];
	int *p[N] ;
	int sum;
	for(i=0;i<N;i++)
	{ 
		for(p[i] = a[i]  ; p[i] < a[i]+M ; p[i]++)
		{ 
			scanf("%d",p[i]);
		}
	}
    /********** Begin *********/
	for(i=0;i<N;i++)
	{ 	sum=0;
		for(p[i] = a[i]  ; p[i] < a[i]+M ; p[i]++)
		{ 
			// printf("%d ",*p[i]);
			sum+=*p[i];
		}
		printf("第%d行和为:%d\n",i,sum);
	}
		
	/********** End **********/
	return 0;
}

测试输入:54 21 36 58 4 78 46 2 35 47 69 28 91 51 32

输出结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值