【c语言】带你真正走进指针的世界——数组与指针的关系(三)

     最近对一句话挺有感触的:我们还没来得急绽放出自己的才华呢,就被选为无用的人......

     遇到一道c语言题不会做,微信问了一位高考上重本的同学,结果他一句不会继续打游戏去了

     最后被一位高考数学不及格只到了专科的同学秒做出来了......

    

————————————————下面是正文——————————————————       

一. 一维数组

        为啥现在才来说数组呢?因为一开始我以为大家对于数组的理解和我是一样的(先入为主),后来发现......嗯......好吧我的错,现在来一幅图说明下我对数组的理解。

       以下定义一个数组

int code[2] = {1,2};

        在我的理解中,它应该是这样的

                                

二. 二维数组

        如果说一维数组的理解差异还不是相差很大,那么二维数组甚至多维数组的理解可以说的是一千个人有一千个哈姆数组了%>_<%,下面还是定义个一个二维数组

int code[2][3]={{1,2},{3,4}};

        在我的理解中,它应该是这样的

       二维数组 code 里面由两个元素,分别是 code[0] 、code[1],它们刚好本身也是一个数组,其中code[0]里面有元素 1,2,0 ,code[1]里面有元素 3,4,0. 所以,当我写出一下代码时

int code[2][3]={{1,2},{3,4}};
printf("%d\n",code);
printf("%d\n",*code);

      编译的结果如下

      如何理解两个结果是一样的呢?其实如果你看得懂二维数组上面那张定义图的话,就很容易理解了。code为数组名,而且指向了第一个数组的地址,第一个元素是 code[0] ,所以输出结果 1638192 ,而 *code 是取出地址所保存的数值,而code里面存了两个值,分别是 code[0]和code[1] 的地址,所以 *code 输出的是第一个值,也就是code[0] 的地址。

三. 一维数组指针

        现在有以下这个程序

#include <stdio.h>

char code[] =
{
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
	0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
	0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
	0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99
};

int main()
{    
	char (*px)[2] = (char(*)[2])code;

	printf("%x\n",*(*(px+2)+2));

    return 0;
}

        编译的结果如下

        这是为何呢?首先,px + 2 ,根据前几篇文章(不知道的去看看,顺便长下热量hiahiahia),指针相加首先是去掉一颗 " * " ,用 类型长度*数组长度*要加的数  就可以算出来 ,在 px+2 中实际上是加了 4 个字节 ,然后 *(px+2) 变成了数组(“ * ” 有去星的作用,不知道的去看我以前的文章,顺便长下热量hiahiahia),再次加 2 之后,就成了数组上的 +2 ,也就是加了 2 个字节,所以,最后一共前进了 6 个字节,在从哪个数组上数一数,结果是输出一个值 6

        然后再加大一下难度,把一维数组指针的类型改变一下

#include <stdio.h>

char code[] =
{
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
	0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
	0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
	0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99
};

int main()
{    
	int (*px)[2] = (int(*)[2])code;

	printf("%x\n",*(*(px+2)+2));

    return 0;
}

          分析一下可能会出现的结果。

          首先,数组指针占据 4 个字节,所以 px+2 实际上是 4*2*2=16 个字节。

          再来,去掉一颗星之后,变成了数组,所以再次 +2 是 数组类型*要加的数 ,也就是 2*4=8 个字节 

          最后, 16+8=24  个字节,所以往后数24位,最后应该会得到数字 24 ,我们来看下结果

                                      

        结果却出乎意料,出现了一堆类似于乱码的东西,但这个真的是代码吗?仔细想想,以为数组指针的类型是 int 类型的,占据 4 个字节 ,所以正确的答案应该是打印出 4个数字而不是1个数字 ,而在汇编中,数据是从高位到低位输出的,所以正确的输出结果应该是倒过来的!所以最后的结果就如图上所显示,分别是 24 25 26 27

四. 二维数组指针

        了解一维数组,二维数组其实也差不多的,只要了解二维数组的定义和指针的定义,答题一样顺手,请看下面程序

#include <stdio.h>

char code[] =
{
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
	0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
	0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
	0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99
};

int main()
{    
	char (*px)[2][2] = (char(*)[2][2])code;

	printf("%x\n",*(*(*(px+2)+2)+2));

    return 0;
}

          分析一下可能会出现的结果。

          首先,数组指针占据 1 个字节,所以 px+2 实际上是 1*2*2*2=8 个字节。

          再来,去掉一颗星之后,变成了一维数组,所以再次 +2 是 一维数组类型*数组宽度*要加的数 ,也就是 1*2*2=4 个字节

          最后,再次去掉一颗星,就变成了数组,所以再次的再次 +2 之后就会是 数组类型*要加的数 ,也就是 1*2=2 个字节 

          最后, 8+4+2=14  个字节,所以往后数14位,最后应该会得到数字 14 ,我们来看下结果

                    

        所以,如果想懂得我是如何在不同类型的指针间相互使用,多维数组指针与一维数组之间灵活运用的话,就得看懂我开头写的数组的定义啦~

猜你喜欢

转载自blog.csdn.net/qq_41884002/article/details/85249193
今日推荐