如何创建类似char * argv的char指针

时间:2015-02-08 08:32:31

标签: c pointers argv

C语言中使用的命令行指针char * argv []允许执行诸如;

之类的操作
ptintf ("%c", argv [3][6]); // to print the 7th element of 4th argument

printf ("%s", argv [3]); // to print the 4th parsed argument

现在我明白argv char数组是在调用main函数之前创建的,而char * argv []只是一个指向编译器创建的数组的指针。

我们如何在C代码中创建一个指针,这将允许类似的操作?

我试过了,

 #include <stdio.h>

int main() {

char array [20] [20];
       char *ptr_array = array ;
      array [0] [0]= 'a';
      array [0][1]= 'b'; 
      array [0] [2] = '\0'; 

      array [1] [0]= 'a';
      array [1][1]= 'b'; 
      array [1] [2] = '\0'; 

      array [2] [0]= 'a';
      array [2][1]= 'b'; 
      array [2] [2] = '\0';          

 // assuming there is content in the array
    printf("%s\n", ptr_array [1]);
    return 0; }

但我最终会在编译时发出警告,并在执行时发出核心转储。

4 个答案:

答案 0 :(得分:1)

您可以使用像

这样的指针数组
int main() {

       char *ptr_array[5] = { "ab","cd", "ef","gh" };     
       printf("%s\n", ptr_array [1]);
       return 0; 
    }

如您所见,argv是一组指针char *argv [],您可以提出与上面所示相同的内容。

请注意,这里的ptr_array只是可读的,你可以通过分配内存或使指针指向可写内存来使其可写。

int main() {

       char *ptr_array[5]; 
       char str[20];
       int i=0;   
       for(i=0;i<5;i++)
       {
         ptr_array[i] = malloc(20);
         scanf("%s",str);
         strcpy(ptr_array[i],str);
       }
       printf("%s\n", ptr_array [1]);
       return 0; 
    }

PS:argv可以是*argv[]**argv

答案 1 :(得分:1)

你想要的是一个指针数组。所以ptr_array的声明应该是

char *ptr_array[20];    // an array of 20 pointer-to-char

以下代码使用strcpy填写array中的两个字符串。 {{0}}确保所有其他字符串都归零。然后声明ptr_array并初始化所有20个指针。最后打印出一个字符串。

int main( void )
{
    char array[20][20] = {{0}};
    strcpy( array[0], "hello" );
    strcpy( array[1], "world" );

    char *ptr_array[20];
    for ( int i = 0; i < 20; i++ )
        ptr_array[i] = array[i];

    printf( "%s\n", ptr_array[0] );
    return 0;
}

答案 2 :(得分:0)

只需array即可完成您想要的任务。无需ptr_array

char array[20][20];
// array initialization
printf("%s\n", array[1]);
printf("%c\n", array[1][1]);

argv是一个char数组的数组。与上述代码中的array完全相同。

命令行参数作为字符串传递(char数组),argv是包含所有字符串的数组。


关于使用*[]

char array[10];

array现在是指向该数组中第一个元素的指针,因此它是char*

例如,char* argv[]char** argv相同:

  • argv是指向包含char*元素的数组中第一个元素的指针,因此它是char**

  • argv[x]访问索引为argv的{​​{1}}数组,因此xargv[x],指向第一个char*在一个字符串(一个char数组)。

  • char访问索引为argv[x][y]的{​​{1}}数组char,因此argv[x]y,是argv[x][y]数组字符串。

答案 3 :(得分:0)

您的array类型为char[20][20]

在大多数情况下,简单地使用array将其转换为指向其第一个元素的指针:&(array[0]),其类型为(*)char[20](指向char数组20的指针)。

您可以将此地址指定给相同类型的指针:

char array[20][20];
char (*ptr_array)[20]; // ptr_array is a pointer to an array of 20 char
ptr_array = array;     // types of ptr_array and (the converted) array are compatible
printf("%s\n", ptr_array[1]);