[英]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.