现在的位置: 首页 > 综合 > 正文

技术随笔:深入理解指针数组,数组指针,指向指针的指针,数组名含义

2012年09月28日 ⁄ 综合 ⁄ 共 718字 ⁄ 字号 评论关闭

(1)指针数组是一个数组,里面包含若干指针,指针数组名指向指针的地址,可赋值给指向指针的指针
 

  int* a[]={"hello" ,"world","!"};  int **p=a;

 

(2)数组指针是一个指针,指向整个数组

 

   如 int v[2][3]={{1,2,3},{4,5,6}} ;  

 

       int b[3]={7,8,9};

 

       int (*p1)[3]=v;      

 

    可分解为 int (*p1)[3];  p1 = v;  p1指向v[0]的地址,即p1 = &v[0], **p为v[0][0]的值。

 

(3)数组名的两层含义:既是数组符号名(犹如 “int a=3;"中a是一个4字节内存的符号名一样),又是指向该数组中第一个元素的地址

 

  比如  int a[3]={1,2,3};  在*a中,a表示a[0]的地址;而在sizeof(a)中,a表示整个数组的符号名,代表着12字节的空间。


(4)在计算机中,访问内存中的任意单元内容皆是通过地址的在汇编语言中,访问内存中的任何单元都是直接用地址(通常借助%ebp,%esp等指针)的,而在c语言中,为了方便引入了符号名,一个符号代表着一块区域,但要注意符号名本身是不占内存空间的,只是在c语言的层次供程序员使用

 

  比如int a=3;告诉编译器为我分配了4字节,以后我使用这块空间时用a就行了,而事实上,经编译编译成汇编代码后,汇编里对该块区域的访问皆是通过地址访问的,汇编语言代码中没有相应的符号a。又如,int a[3]={1,2,3}; 对应着12字节的空间,和4个符号(a[0],a[1],a[2],a),但这4个符号都是不占用内存空间的,汇编代码里也没有这4个符号。

抱歉!评论已关闭.