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

通过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

 

分析:

 通过3个程序分析数组与指针区别_第1张图片

注意:

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

 

分析:

 通过3个程序分析数组与指针区别_第2张图片

与程序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

 

 

你可能感兴趣的:(c,存储,output)