2010-09-29 62 views
0

gcc 4.4.4 c89獲取三字指針字符的地址

我只是想知道爲什麼我得到不同的內存地址。當我在主打印動物的地址,我得到如下:

animals [ rabbit ] : [ 0xbfab2e48 ] 
animals [ rabbit ] : [ 0xbfab2e48 ] 

然而,當我在打印功能,我得到不同的存儲位置。我認爲他們應該是一樣的。

ptr animals [ rabbit ] : [ 0xbfab2e08 ] 
ptr animals [ rabbit ] : [ 0xbfab2e08 ] 

非常感謝任何建議,

int main(void) 
{ 
    char *animals[] = {"rabbit", "cat", "dog", "elephant", "racoon", NULL}; 
    char *countries[] = {"india", "amercia", "france", "spain", "canada", "mexico", NULL}; 
    char *cars[] = {"ford fista", "Masda 3", "honda city", "toyata cote", NULL}; 
    char **ptr_data[] = {animals, countries, cars, NULL}; 

    printf("animals [ %s ] : [ %p ]\n", *animals, (void*)animals); 
    printf("animals [ %s ] : [ %p ]\n", animals[0], &animals[0]); 

    print_data_ptr(ptr_data); 

    return 0; 
} 

void print_data_ptr(char ***ptr) 
{ 
    char **data_list = NULL; 

    printf("ptr animals [ %s ] : [ %p ]\n", *ptr[0], (void*)&ptr[0]); 
    printf("ptr animals [ %s ] : [ %p ]\n", **ptr, (void*)ptr); 
} 

回答

4

animalschar *值的陣列,和是ptr_datachar **值的陣列。

當在此線初始化ptr_data

char **ptr_data[] = {animals, countries, cars, NULL}; 

animals評價爲一個指針到其第一元件 - 所以ptr_data[0]相同&animals[0] - 在animals第一char *的地址。同樣的事情發生在主animals&animals[0]的兩個printf()函數中,其計算結果與存儲在ptr_data[0]中的指針值相同。

在你的函數,ptr是一個指針,在主ptr_data的第一個元素 - 所以ptr相當於&ptr_data[0]&ptr[0]完全等價於ptr - 因此&ptr[0]顯示的地址爲ptr_data[0],而不是存儲在那裏的地址。如果您打印ptr[0],您將得到animals[0]的地址。