关于数组指针

本文分析了如何正确使用数组指针,特别是二维数组的指针,通过实例对比代码1和代码2的执行结果,揭示了数组指针的行级指向原理,以及为何代码2中n不为数组列数导致的问题。深入讲解了数组指针作为二级指针的概念,并提到了初始化和输出技巧。
摘要由CSDN通过智能技术生成

先上两个企图用数组指针输出数组的代码:

//代码1:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int (*p)[4]);
int main(void)
{
	int a[3][4];
	int(*p)[4] = a;
	int i, j;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			scanf("%d", *(p + i) + j);
		}
	}
	print(a);

	return 0;
}
void print(int(*p)[4])
{
	int i, j;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}

输入:1 1 1 1 2 2 2 2 3 3 3 3

输出:1 1 1 1 

           2 2 2 2

           3 3 3 3

//代码:2:
 

#include <stdio.h>
int main(void)
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int(*p)[5] = &a;
	int i;
	
	for (i = 0; i < 5; i++)
	{
		printf("%d\n", *(p + i));
	}

	return 0;
}

输出:1274935144
            1274935164
            1274935184
            1274935204
            1274935224

总结:两个代码都是初始化数组并输出,但代码1可以正常运行 代码2不行。由此我们可以
得出结论:
    数组指针一般形式为: 类型 (*p)[n];
    数组指针是指向数组的指针,指针可以指向二维数组的某一行,但不可以指向
    数组的某一个。 p指向二维数组某一行时n必须为列数,指向一维数组时必须为
    数组元素个数。这也就是为什么代码2不行的原因。
       但如果把代码2中的n改为5,那输出时结果为:
            1274935144
            1274935164
            1274935184
            1274935204
            1274935224
    可以看到这些都是地址并且相差20,这是因为数组指针实际上是个二级指针因此
    p+i会直接跳过i个一维数组的内存,也正因为是二级指针,因此初始化时要用&a
    而不是a。如果用*(*(p)+i)就可以了,但是输出一维数组没有这个必要搞这么复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值