请在下面的qsort标准代码中解释为什么argv的地址和 argv [0]不同。 我是c的新手。试图理解双指点概念。
a[j] (while calling temp.copie(a[j],a[j+1]);)
输出: ./a.out ramya usha
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;
}
答案 0 :(得分:1)
为什么它应该是一样的? (OP问为什么argv和argv [0]的地址不同。)
main()
是一个功能。现在是一个指向它的指针数组 - 数组衰减到指向第一个元素的指针。现在局部变量argv
包含该值。 (那个指针值)。
你打印它。然后现在访问第一个元素的地址。那个地址正在打印。现在主要的内容是它,它是char数组的衰减指针值。
您打印的这三个不同的地址。是的,他们是不同的。它们不同于不同的语法糖。不再是惊喜。
为了给您一个更清晰的想法 - 请认为&argv[0]
与argv
相同。并不奇怪,它与&argv
不同。
同时打印指针应为void*
。同时启用编译器警告,您将看到更多错误/警告检查它们。
答案 1 :(得分:0)
正如@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
是双指针的事实不会改变它仍然是指针的事实。它的值是其他一些值的位置。
处理指针时要做的主要事情是注意。如果你有一个指针变量,无论它是单指针,双指针还是三指针(如果你有更多,那么你还有其他更严重的问题),你必须记住完全当您使用*
或&
运算符时,您想要的是什么,以及完全您在使用时所获得的内容。