【转】C++ 数组和指针

一道华为的面试题,mark下~ 原链接:http://www.programfan.com/club/showpost.asp?id=29498

------------------------------------------

题目:

文件1里声明全局变量:int array[5];
文件2里声明全局变量:extern int *array;
问在运行时会不会报错,如果会,是在编译时还是在链接时?

解答:

//extern int  array[5];   a[4]=123;
movl    $123, array+16                         
声明成 数组时, array是个地址,array[i]实际上就是array+i
                       

//extern int *array; a[4]=123
movl    array, %eax  
addl    $16, %eax                             
movl    $123, (%eax)
声明成指针时,需要对指针进行解引用
就是  先把指针里存放的值+偏移 然后解引用


C语言语法给人的感觉是 数组跟指针几乎一样  但是内部实现是完全不同的

上面的情况跟下面的是有区别的
int a[10];
int *p=a;
p本身的地址跟a不同,p中存储的是a的值
p[5] ==    (p中存储的值 + 5*sizeof(int)) 这个地址中存储的值 p中存储的值是a的值

而int a[10];
extern int *a;
此处a的地址和a相等,是同一个数值
a[5]== (a中存储的值+5*sizeof(int))这个地址存储的值  第二个a中存储的值 就是a[0]的值

posted @ 2011-08-10 20:09  小卡的土豆园  阅读(149)  评论(0)    收藏  举报