关于数组与指针的思考与总结(Ⅱ)
关于数组与指针的思考与总结(Ⅱ)
这是我15年上半年,也就是刚入大学的时候,发表的第一篇博文.之前是发表在sina上的,现在我把它转到cnblogs这儿,找回当时的认真.
这篇文章是为了弄清指针操作二维数组的含义,再有如何申明指向二维数组的指针等废话云云。有不足之处恳请大家批评指教。
先引入一段废话:
在关于数组与指针的思考与总结{Ⅰ }中已经谈到"在c语言中根本不存在array[0]的语法表达式 ; 任何的 [] 运算法都会转化为指针的运算符"意思就是说任何的对数组的访问我都可以用指针的形式去代替,对么? 答案是肯定的。但是鉴于指针对数组 访问的语法复杂度,于是就衍生出了"[]"这样的运算符,艺多不压身。本文章就来讨论一下在二维数组中指针的表达式;
一、指针操作二维数组
引入程序:
#include
int main( void )
{
int array[3][2] =
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
};
return(0);
}
我这里首先提出一个观点: 二维数组就是一个一维的一维数组; 三维就是一个一维的一维的一维数组....以此类推。为什么这么讲呢。
在二维数组中有两个一维数组,分别设为X1 , X2

X1包含X2的第一个,也就是行数;X2包含每行的成员;
那么array这个数组名代表什么呢?
代表X1中的第一个地址;
证明:
printf("array = %p\tarray[0] = %p\t&array[0][0] = %p",array,array[0],&array[0][0]);
运行结果:
array = 0028FEC8 array[0] = 0028FEC8 &array[0][0] = 0028FEC8
既然地址相同,那地址所指向的值一定也相同;
printf("**array = %d\t*array[0] = %d\tarray[0][0] = %d",**array,*array[0],array[0][0]);
运行结果:
**array = 1 *array[0] = 1 array[0][0] = 1
这里的array = &array[0] = &array[0][0]
*array = array[0] ;
**array = *array[0] = array[0][0];
如果深刻理解了,在一维数组中的数组名含义的话,这里的表达式应该是不难理解的;
总结起来就是:
array蜕化为指针运算的时候,array = &array[0] 请注意 array[0]也是个地址值,相当于一维数组中的数组名!这里是重点;
在前面的模糊理解中我们下面来几个具体的操作,用实践验证真理!
还是那个数组:
#include
int main( void )
{
int array[3][2] =
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
};
return(0);
}
我要输出第二行第二个,也就是4;
3.从难(原始)入手:
代码如下:
printf("array[1][1] = %d",*(*(array + 1) + 1));
步骤分析:
array + 1 : 行数加1,注意是行数的地址加1;//变换行数(定位Ⅰ )
*(array + 1) : 对其取值,结果是 array[1]; 注意:再次提醒这是个地址值!;//行数转型
*(array + 1) + 1 : 对上式加1,结果是array[1] + 1;此时已经是4的地址值了!;//变换列数(定位Ⅱ)
*(*(array + 1) + 1 ):由于在上式中已经得到了4的地址值,这步就是对其取值了;//列数转型
2.为了更方便的理解,还可以这样表达:
printf("array[1][1] = %d",*(array[1] + 1));
步骤分析:
array[1] + 1 :定位到4的地址;//定位
*(array[1] + 1) : 对4地址取值;//取值
1.再次简化:
printf("array[1][1] = %d\n",array[1][1]);
这也就演化为了我们熟悉的表达式了。
二、如何申明指向二维数组的指针
依旧是这个数组:
#include
int main( void )
{
int array[3][2] =
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
};
return(0);
}
我想申明指向这个二维数组的指针:
int (*p)[2] = array; //数组指针
注意不能写成int *p[2];//指针数组
声明的原因很简单:
int (*p)[2]就相当于int p[][2],它就是一个二维数组的指针,可以指向一个第二维为2的二维数组
那么int *p[2]是什么意思呢?
就是你申明了2个数组,用来存放指针变量的;
这里介绍一篇博客:
详细介绍了这两者的区别(看看大牛的文笔)!
http://www.cnblogs.com/mq0036/p/3382732.html
由于本人水平有限,本片文章理应涉及内存分配等问题,只是目前还未深入学习到那,不过这是个时间可以解决的问题。加油!!!
浙公网安备 33010602011771号