关于数组传递、二位数组传递的相关试验总结

    最近程序中应用到了数组指针,而且应用到了数组指针的参数传递,搞的一头雾水。网上的大牛都是讲数组指针的概念和应用,基本没有设计数组指针额参数传递,无奈只能自己摸索了。

    首先复习一维数组的相关知识,直接上程序,特别简单的一段,主要是为了验证指针变化和地址变化的逻辑和自己预想的是否相同

#include <stdio.h>

void main()
{
	int arr[10]={0,,1,2,3,4,5,6,7,8,9};

	int *pt;

	pt = arr;

	printf("*pt = ");
	printf("%d\n",*pt);

	printf("*pt++ = ");
	printf("%d\n",*pt++);

	printf("*(pt++) = ");
	printf("%d\n",*(pt++));

	printf("pt = ");
	printf("%d\n",pt);

	printf("pt++ = ");
	printf("%d\n",pt++);

	printf("++pt = ");
	printf("%d\n",++pt);

  运行结果如下

*pt = 0  //arr[0]的数值
*pt++ = 0  //仍然是arr[0]的数值,但执行之后指针地址+1,注意是地址+1
*(pt++) = 1 //arr[1]的数值,执行之后指针地址再+1,
pt = 1703696 //arr[2]的地址
pt++ = 1703696 //arr[2]的地址,执行之后地址再+1
++pt = 1703704 //这个是arr[4]的地址,int类型占用4个byte,两次+1,之后地址+8
 

之后是二维数组的试验,代码如下

#include <stdio.h>

void main()
{
	int arr[3][5]={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14}};

	int (*pt)[5];

	pt = arr;


	printf("*pt[0] = ");
	printf("%d\n",*pt[0]);	//应该是arr[0][0]的值

	printf("*pt = ");
	printf("%d\n",*pt);		//应该是arr[0]这一行的地址

	*pt++;
	printf("*pt = ");
	printf("%d\n",*pt++);		//应该是arr[1]这一行的地址

	printf("*pt = ");
	printf("%d\n",*pt);		//应该是arr[2]这一行的地址

	printf("*pt[0] = ");
	printf("%d\n",*pt[0]);	//应该是arr[2][0]的值

	(*pt[0])++;
	printf("(*pt[0])++ = ");
	printf("%d\n",(*pt[0])++);	//应该是arr[2][1]的值
	
	printf("*pt = ");
	printf("%d\n",*pt);	//应该是arr[2]这一行的地址

	
}

    运行结果如下

*pt[0] = 0  //和预想的相同,pt[0]代表第一行第一列的地址,而*pt[0]是arr[0][0]的值
*pt = 1703668  //arr[0]的行地址
*pt = 1703688  //应该是arr[1]的地址,此处是正确的
*pt = 1703708  //应该是arr[2]的地址,此处是正确的
*pt[0] = 10       //应该是arr[2][0]的值,此处也是正确的
(*pt[0])++ = 11//应该是arr[2][1]的值,此处是正确的
*pt = 1703708 //应该是arr[2]的地址,此处是正确的

 

本来想做的函数调用在验证一下,但是*pt++和pt++的结果居然是一样的,不明白为何,我用的编译器是VC++6.0,后来参照另一篇文章做了试验验证,文章如下

https://blog.csdn.net/Hots3y/article/details/90415719

需要特殊说明的是,我的那种对数组直针的操作方式不准确,应该采用下面的操作方式对行列进行操作

*(*(arr+1)+1)=333;
*(arr[2]+1) = 444;

或者直接采用arr[0][0]的方式进行写入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值