有人可以解释如何在以下代码中将内存分配给双指针

时间:2018-01-18 16:59:38

标签: c pointers

请在下面的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;
          }

2 个答案:

答案 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是双指针的事实会改变它仍然是指针的事实。它的值是其他一些值的位置。

处理指针时要做的主要事情是注意。如果你有一个指针变量,无论它是单指针,双指针还是三指针(如果你有更多,那么你还有其他更严重的问题),你必须记住完全当您使用*&运算符时,您想要的是什么,以及完全您在使用时所获得的内容。