繁体   English   中英

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

[英]How to create a similar char pointer like char *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数组是在调用主函数之前创建的,并且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; }

但最终在编译时出现警告,在执行时出现核心转储。

您想要的是一个指针数组。 所以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;
}

您可以使用类似的指针数组

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

您可以使用简单的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在索引阵列x ,从而argv[x]是一个char* ,指向第一char在字符串(一个char数组)。

  • argv[x][y]在索引y处访问char数组argv[x] ,因此argv[x][y]char ,它是char数组字符串中的一个元素。

您的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]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM