您的位置:首页 > 其它

通过3个程序分析数组与指针区别

2011-04-10 12:28 351 查看

通过3个程序分析数组与指针区别

总结:

1.指针本身需要占用内存空间,指针的值是指向位置的地址(例如c)

2.数组名实际就是个地址。数组名的值是个指针常量,也就是数组第一个元素的地址,所以,数组名这个指针并不需要像普通指针c那样占用内存空间,它实际就是一个地址0xbffff3c8,在这个地址里存储的就是数组第一个元素。b=&b。

程序1:
#include<stdio.h>
int main()
{
int a=12;
int b[1]={a};
int **c=&b;

printf("&a is 0x%x/n",&a);
printf("a is %d/n",a);
printf("&b is 0x%x/n",&b);
printf("b is 0x%x/n",b);
printf("*b is %d/n",*b);
printf("&c is 0x%x/n",&c);
printf("c is 0x%x/n",c);

return 0;
}


Output:
&a is 0xbffff3cc
a is 12
&b is 0xbffff3c8
b is 0xbffff3c8
*b is 12
&c is 0xbffff3c4
c is 0xbffff3c8

Breakpoint 1, main () at free_test.c:15
15 return 0;
(gdb) x /4xb 0xbffff3cc
0xbffff3cc: 0x0c 0x00 0x00 0x00
(gdb) x /4xb 0xbffff3c8
0xbffff3c8: 0x0c 0x00 0x00 0x00
(gdb) x /4xb 0xbffff3c4
0xbffff3c4: 0xc8 0xf3 0xff 0xbf

分析:



注意:
1.指针的值是指向位置的地址(例如c)
2.数组名的值是个指针常量,也就是数组第一个元素的地址,所以,数组名这个指针并不需要像普通指针c那样占用内存空间,它实际就是一个地址0xbffff3c8,在这个地址里存储的就是数组第一个元素。b=&b。

程序2

#include<stdio.h>
int main()
{
int a=12;
int *b=&a;  //这样理解:b的类型为int *,即指向int的指针,为b赋值:b=&a
int **c=&b; //这样理解:c的类型为int **,即指向int型指针的指针,为c赋值:c=&b

printf("&a is 0x%x/n",&a);
printf("a is %d/n",a);
printf("&b is 0x%x/n",&b);
printf("b is 0x%x/n",b);
printf("*b is %d/n",*b);
printf("&c is 0x%x/n",&c);
printf("c is 0x%x/n",c);
return 0;
}


Output:
&a is 0xbffff3cc
a is 12
&b is 0xbffff3c8
b is 0xbffff3cc
*b is 12
&c is 0xbffff3c4
c is 0xbffff3c8

Breakpoint 1, main () at free_test.c:34
34 return 0;
(gdb) x /4xb 0xbffff3c4
0xbffff3c4: 0xc8 0xf3 0xff 0xbf
(gdb) x /8xb 0xbffff3c4
0xbffff3c4: 0xc8 0xf3 0xff 0xbf 0xcc 0xf3 0xff 0xbf
(gdb) x /12xb 0xbffff3c4
0xbffff3c4: 0xc8 0xf3 0xff 0xbf 0xcc 0xf3 0xff 0xbf
0xbffff3cc: 0x0c 0x00 0x00 0x00

分析:



与程序2对比,可知当把b定义为指针时,b!=&b。

看懂以上两个程序,第三个也就不难理解了。
程序3:
#include<stdio.h>
int main()
{
char *strings[3];
strings[0]="hello";
strings[1]="world";
strings[2]="!";
printf("&strings is 0x%x/n",&strings);
printf("strings is  0x%x/n",strings);
printf("*strings is 0x%x/n",*strings);
printf("/n");
printf("&strings[0] is   0x%x/n",&strings[0]);
printf("strings[0] is    0x%x/n",strings[0]);
printf("*strings[0] is   %c/n",*strings[0]);
printf("strings[0][0] is %c/n",strings[0][0]);
printf("/n");
printf("&strings[1] is   0x%x/n",&strings[1]);
printf("strings[1] is    0x%x/n",strings[1]);
printf("*strings[1] is   %c/n",*strings[1]);
printf("strings[1][0] is %c/n",strings[1][0]);
return 0;
}

Output:
root@fc-desktop:~/Documents/sourcefile/free_test# ./free_test &strings is 0xbfee2d64
strings is 0xbfee2d64
*strings is 0x8048620

&strings[0] is 0xbfee2d64
strings[0] is 0x8048620
*strings[0] is h
strings[0][0] is h

&strings[1] is 0xbfee2d68
strings[1] is 0x8048626
*strings[1] is w
strings[1][0] is w
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐