数组和指针

来源:互联网 发布:怎么改mac地址 编辑:程序博客网 时间:2024/06/05 19:16
提问:
int i[4][4];
i +1 和*(i+1)的值为什么一样?
i是否实际上是&i[0];而不是&i[0][0]?
i是否为二级指针?
int (*p)[4] = i;
为什么就可以通过*(*(p+i)+j)来操控数组了?
经典的回答:
其实只需要跟你解释以下 int i[4][4]; 这代码的具体含义你就知道了。
首先变量i是一个具有四个元素的数组,这四个元素又都指向一个具有四个元素的整型数组。
把这句话理解了, 就所有的都理解了。
 举个例子,就象你其中说的“ i是否实际上是&i[0];而不是&i[0][0]?”
&i[0] 的值和&i[0][0]的值是相等的,但意义不一样(对编译器来说),也就是输出的结果肯定是不同的,因为i[0] 保存的是一个指向一个具有四个元素的整型数组,而&i[0]则是获取这个数组的地址, 同样对于i[0][0]来说,i[0][0]是i[0]数组中的第一个数据,也就是一个整数,&i[0][0]则是这个整数的地址。

1 #include <stdio.h>
2
3 int main()
4 {
5 int a[3][4];
6 int i,j;
7 int temp[256];
8 unsigned int t = 0;
9 if(t < 255)
10 printf("0 < 255");
(gdb) 
11 else
12 printf("0 > 255");
13 for(t = 0;t <= 255;t++ )
14 temp[t] = t;
15
16 int count = 0;
17 for(i = 0; i < 3; i++)
18 {
19 for(j = 0; j < 4; j++)
20 {
(gdb) 
21 a[i][j] = count++;
22 printf("%3d",a[i][j]);
23 }
24 printf("\n");
25 }


对上面一段代码到底二位数组首地址是怎么回事:

(gdb) b 30
Breakpoint 1 at 0x400688: file array_test.c, line 30.
(gdb) run
Starting program: /mnt/work1/yangbin2/test/array_test 
0 < 255  0  1  2  3
  4  5  6  7
  8  9 10 11
5
-6864
5
5


Breakpoint 1, main () at array_test.c:30
30 printf("%d\n",a[1][1]);
(gdb) p a
$1 = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}
a是一个二位的数组
(gdb) p *(a+5)
$2 = {0, 0, -6648, 32767}
(gdb) p (a[1]+1)
$3 = (int *) 0x7fffffffe4f4
(gdb) p *(a[1]+1)
$4 = 5
(gdb) p *(&a[1][1])
$5 = 5
(gdb) p *(a+1)[1]
$6 = 8
(gdb) p *(a+1)
$9 = {4, 5, 6, 7}
(gdb) p **(a+1)
$10 = 4
(gdb) p *(*a+5)
$11 = 5
(gdb) p *(a+1)[1]
$12 = 8
(gdb) p (*(a+1))[1]
$13 = 5
(gdb) p &a
$15 = (int (*)[3][4]) 0x7fffffffe4e0
(gdb) p &a+4
$16 = (int (*)[3][4]) 0x7fffffffe5a0
(gdb) p *(&a+4)
$17 = {{0, 0, 4196016, 0}, {-6648, 32767, 1, 0}, {0, 0, 0, 0}}
(gdb) p *(&a+1)
$18 = {{3, 4, 256, 12}, {0, 0, -140261523, 32767}, {0, 0, -6648, 32767}}
(gdb) p *((int)&a+1)
Cannot access memory at address 0xffffffffffffe4e1
(gdb) p *((char)&a+1)
Cannot access memory at address 0xffffffffffffffe1
(gdb) p *((int *)&a+1)
$19 = 1
(gdb) p *((int *)&a+2)
$20 = 2
(gdb) p *((int *)&a+5)
$21 = 5
(gdb) p *((int *)&a+11)
$22 = 11
(gdb) p *((int *)&a+12)
$23 = 3
(gdb) p *((char)&a+1)
Cannot access memory at address 0xffffffffffffffe1
(gdb) 
Cannot access memory at address 0xffffffffffffffe1
(gdb) p *((int *)&a+13)
$24 = 4
(gdb) p *((int *)&a+14)
$25 = 256
(gdb) p *((int *)&a+15)
$26 = 12
(gdb) p *a
$27 = {0, 1, 2, 3}
(gdb) p **a
$28 = 0
(gdb) p *a+1
$29 = (int *) 0x7fffffffe4e4
(gdb) p (*a)+1
$30 = (int *) 0x7fffffffe4e4
(gdb) p *((int *)0x7fffffffe4e4)
$31 = 1
(gdb) p *a
$32 = {0, 1, 2, 3}
(gdb) p &*a
$33 = (int (*)[4]) 0x7fffffffe4e0
(gdb) p (int)a
$34 = -6944
(gdb) p (int*)a
$35 = (int *) 0x7fffffffe4e0
(gdb) p *0x7fffffffe4e0
$36 = 0
(gdb) p *((int *)0x7fffffffe4e0)
$37 = 0
(gdb) p a
$38 = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}
(gdb) p *((int (*)[4])0x7fffffffe4e0)
$39 = {0, 1, 2, 3}
(gdb) p ((int *)a+5)
$40 = (int *) 0x7fffffffe4f4
(gdb) p *((int *)a+5)
$41 = 5
(gdb) p (*a+1)[]
A syntax error in expression, near `]'.
(gdb) p (*a+1)[1]
$42 = 2
(gdb) p *(a+1)[1]
$43 = 8
(gdb) p *(a+1)[1]+1
$44 = 9
(gdb) p *(a)[1]
$45 = 4
(gdb) p *(a+0)[1]
$46 = 4
(gdb) p *(a+1)[1]
$47 = 8
(gdb) p *a
$48 = {0, 1, 2, 3}
(gdb) p *(a+1)
$49 = {4, 5, 6, 7}
(gdb) p *(a+1)[1]
$50 = 8
(gdb) p (a+1)
$51 = (int (*)[4]) 0x7fffffffe4f0
(gdb) p *(a+1)
$52 = {4, 5, 6, 7}
(gdb) p **(a+1)
$53 = 4
(gdb) p *(a+1)+1
$54 = (int *) 0x7fffffffe4f4
(gdb) p (*(a+1)+1)
$55 = (int *) 0x7fffffffe4f4
(gdb) p *(*(a+1)+1)
$56 = 5
(gdb) p a+1
$57 = (int (*)[4]) 0x7fffffffe4f0
(gdb) p a
$58 = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}
(gdb) p *(a+1)
$59 = {4, 5, 6, 7}
(gdb) p *(a+2)
$60 = {8, 9, 10, 11}
(gdb) p *(a+1)[1]
$61 = 8
(gdb) p *((a+1)[1])
$62 = 8
(gdb) p (*((a+1))[1])
$63 = 8
(gdb) p (*((*a+1))[1])
Cannot access memory at address 0x2
(gdb) p (((*a+1))[1])
$64 = 2
(gdb) p (a+1)[1]
$65 = {8, 9, 10, 11}
(gdb) p (a+1)[0]
$66 = {4, 5, 6, 7}
(gdb) p (a)[0]
$67 = {0, 1, 2, 3}
(gdb) p (a)[1]
$68 = {4, 5, 6, 7}
(gdb) p *(a)[1]
$69 = 4
(gdb) p *(a)[1]+1
$70 = 5
(gdb) p *(a+1)[1]
$71 = 8
(gdb) p *((a+1))[1]
$72 = 8
(gdb) p *(((a+1))[1])
$73 = 8
(gdb) p *(((a))[1])
$74 = 4
(gdb) p (*(a+1))[1]
$75 = 5
(gdb) p *(a+1)
$76 = {4, 5, 6, 7}
(gdb) p (a+1)
$77 = (int (*)[4]) 0x7fffffffe4f0
(gdb) p a
$78 = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}
(gdb) p a+0
$79 = (int (*)[4]) 0x7fffffffe4e0
(gdb) p (a+1)[1]
$80 = {8, 9, 10, 11}
(gdb) p (a+1)[0]
$81 = {4, 5, 6, 7}
(gdb) p (*(a+1))[0]
$82 = 4
(gdb) p (*(a+1))[1]
$83 = 5
(gdb) p (*(a+1))[2]
$84 = 6
0 0
原创粉丝点击