最近程序中应用到了数组指针,而且应用到了数组指针的参数传递,搞的一头雾水。网上的大牛都是讲数组指针的概念和应用,基本没有设计数组指针额参数传递,无奈只能自己摸索了。
首先复习一维数组的相关知识,直接上程序,特别简单的一段,主要是为了验证指针变化和地址变化的逻辑和自己预想的是否相同
#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]的方式进行写入