簡體   English   中英

有人可以在以下代碼中解釋如何將內存分配給雙指針

[英]Can someone explain how memory is allocated to double pointer in the following code

請在下面的qsort標准代碼中說明,為什么argv和argv [0]的地址不同。 我是c的新手。 試圖了解雙指針的概念。

    static int compare( void const * p1, void const *p2 )
    {
      return strcmp( * ( char * const*  )p1, * ( char * const * )p2 );
     }

     int main( int arg, char **argv )
      {
        if( arg < 2 )
          {
            fprintf( stderr, "arguments should be more than 1" );
            exit( 0 );
           }
        printf( "\n address of argv %p", &argv );
        printf( "\n address of argv[ 0 ] %p", &argv[ 0 ] );
        printf( "\n address of argv[ 1 ] %p", &argv[ 1 ] );
        printf( "\n address of argv[ 2 ] %p", &argv[ 2 ] );
        printf( "\n Value of argv[ 0 ] %p %s", argv[ 0 ], argv[ 0 ] );
        printf( "\n Value of argv[ 1 ] %p %s", argv[ 1 ], argv[ 1 ] );
        printf( "\n Value of argv[ 2 ] %p %s \n ", argv[ 2 ], argv[ 2 
                 ]  );

        qsort( &argv[ 1 ], arg - 1, sizeof( char* ), compare );
         int j;  
         for( j = 1; j < arg; j++ )
          {
             puts( argv[ j ] );
             printf( "\n" );
             }
           return 0;
          }

輸出:./a.out ramya usha

address of argv 0x7ffede23dde0   
address of argv[ 0 ] 0x7ffede23dee8
address of argv[ 1 ] 0x7ffede23def0
address of argv[ 2 ] 0x7ffede23def8
Value of argv[ 0 ] 0x7ffede23e2f0 ./a.out
Value of argv[ 1 ] 0x7ffede23e2f8 ramya
Value of argv[ 2 ] 0x7ffede23e2fe usha


Why address of argv is '0x7ffede23dde0' whereas argv[ 0 ] it is
    0x7ffede23dee8

那么為什么要一樣呢? (OP詢問為什么argv和argv [0]的地址不同。

main()是一個函數。 現在是一個指向它的指針數組-該數組衰減到指向第一個元素的指針。 現在,局部變量argv包含該值。 (該指針值)。

您打印它。 然后,您訪問第一個元素的地址。 該地址正在打印。 現在最主要的是它的內容,它是char數組的衰減指針值。

您已經打印了這三個不同的地址。 是的,他們是不同的。 並不是說它們是同一個語法糖不同的東西。 沒有更多的驚喜。

為了給你一個更清晰的認識-認為這&argv[0]無非是一樣argv 毫無疑問,它將與&argv不同。

同樣,打印指針應該void* 同時啟用編譯器警告,您將看到更多錯誤/警告對其進行檢查。

正如@coderredoc指出的那樣,當您使用&argv ,您正在詢問局部變量argv的位置,該變量與參數數組的內容無關。

如果您將注意力集中在程序的輸出上,這就是告訴您的內容(為簡潔起見,我縮短了內存地址):

location          variable          value

0xdde0            argv              0xdee8    
0xdee8            argv[0]           0xe2f0   
0xdef0            argv[1]           0xe2f8
0xdef8            argv[2]           0xe2fe
.
.
0xe2f0            argv[0][0]        '.'  => ./a.out\0
0xe2f8            argv[1][0]        'r'  => ramya\0   
0xe2fe            argv[2][0]        'u'  => usha\0

argv是雙指針的事實並不會改變它仍然是指針的事實。 它的值是其他某個值的位置。

處理指針時,主要要做的就是注意 當你有一個指針變量,無論是單,雙或三指針(如果你有比這更多,那么你有其他更嚴重的問題),你要記住,你想要什么 ,當你使用*或在&運營商,當你做你得到什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM