数组指针与二维数组的寻址

数组指针与二维数组的寻址,引例:已知如下程序

1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 }

试写出程序的输出值。(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出来的,但是这个题还是比较经典,所以还是拿来当一个例子来说明一下数组指针到底是个什么玩意)

最初在学习C语言时,就一直为这两个名词所困扰。其实也怪汉语的博大精深,两个词交换一下位置,所表示的含义就不一样了。如果直接从英文来说,指针数组叫做Array of pointers,明显重点是array,至于是什么样的array呢,就是存放pointers的array。而数组指针叫做pointer of an array,重点是pointer,那么这个pointer 指向的是什么呢,是一个array。当然这个指向的array到底是什么样的,还需要方括号的维度说明,以及前面的类型说明。

接着回到刚才的引例,x为定义的一个二维数组,p是一个数组指针,指向一个长度为4的数组,一开始指向x的第一行(x的行是一个长度为4的int型数组)接下来一个for循环,依次对p+1取值,加上k(实际就是1)后再取值,并将其累加到变量n上。循环一共执行了2次,分别取第1行和第2行(对应第一个下角标0和1)的第一个元素(也就是x[0][1],x[1][1]),因此最后的输出结果是3+11=14.

光从纸面上分析显然是不够的。GCC编译器对上述程序产生如下的代码

1 0x401340 push %ebp 2 0x401341 mov %esp,%ebp 3 0x401343 and $0xfffffff0,%esp 4 0x401346 sub $0x50,%esp 5 0x401349 call 0x4019d0 <__main> 6 0x40134e movl $0x1,0x10(%esp) 7 0x401356 movl $0x3,0x14(%esp) 8 0x40135e movl $0x5,0x18(%esp) 9 0x401366 movl $0x7,0x1c(%esp) 10 0x40136e movl $0x9,0x20(%esp) 11 0x401376 movl $0xb,0x24(%esp) 12 0x40137e movl $0x2,0x28(%esp) 13 0x401386 movl $0x4,0x2c(%esp) 14 0x40138e movl $0x6,0x30(%esp) 15 0x401396 movl $0x8,0x34(%esp) 16 0x40139e movl $0xa,0x38(%esp) 17 0x4013a6 movl $0xc,0x3c(%esp) 18 0x4013ae lea 0x10(%esp),%eax 19 0x4013b2 mov %eax,0x44(%esp) 20 0x4013b6 movl $0x1,0x40(%esp) 21 0x4013be movl $0x0,0x48(%esp) 22 0x4013c6 movl $0x0,0x4c(%esp) 23 0x4013ce jmp 0x4013f9 <main+185> 24 0x4013d0 mov 0x4c(%esp),%eax 25 0x4013d4 lea 0x0(,%eax,4),%edx 26 0x4013db mov 0x40(%esp),%eax 27 0x4013df add %edx,%eax 28 0x4013e1 lea 0x0(,%eax,4),%edx 29 0x4013e8 mov 0x44(%esp),%eax 30 0x4013ec add %edx,%eax 31 0x4013ee mov (%eax),%eax 32 0x4013f0 add %eax,0x48(%esp) 33 0x4013f4 addl $0x1,0x4c(%esp) 34 0x4013f9 cmpl $0x1,0x4c(%esp) 35 0x4013fe jle 0x4013d0 <main+144> 36 0x401400 mov 0x48(%esp),%eax 37 0x401404 mov %eax,0x4(%esp) 38 0x401408 movl $0x403024,(%esp) 39 0x40140f call 0x401c40 <printf> 40 0x401414 leave 41 0x401415 ret

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f42a0f7cefb839b8ecae9791cebf70cc.html