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

如何创建类似char*argv的char指针,c,pointers,argv,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代码中创建一个允许类似操作的指针

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; }
#包括
int main(){
字符数组[20][20];
char*ptr_数组=数组;
数组[0][0]=“a”;
数组[0][1]=“b”;
数组[0][2]='\0';
数组[1][0]=“a”;
数组[1][1]=“b”;
数组[1][2]='\0';
数组[2][0]=“a”;
数组[2][1]=“b”;
数组[2][2]='\0';
//假设数组中有内容
printf(“%s\n”,ptr_数组[1]);
返回0;}

但我在编译时会得到一个警告,在执行时会得到一个内核转储。

只需使用
数组
就可以实现您想要的功能。不需要
ptr\u阵列

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

argv
是字符数组的数组。与上述代码中的数组完全相同

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


关于
*
[]
的使用:

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

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

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

  • argv[x]
    访问索引
    x
    处的
    argv
    数组,因此
    argv[x]
    是一个
    char*
    ,指向字符串(一个
    char
    数组)中的第一个
    char

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


您可以使用指针数组,如

int main() {

       char *ptr_array[5] = { "ab","cd", "ef","gh" };     
       printf("%s\n", ptr_array [1]);
       return 0; 
    }
正如您所看到的,argv是一个指针数组
char*argv[]
您可以得到与上面所示相同的结果

请注意,这里的ptr_数组是可读的,您可以通过分配内存或使指针指向可写内存使其可写

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; 
    }
intmain(){
char*ptr_数组[5];
char-str[20];
int i=0;

对于(i=0;i您的
数组
具有类型
char[20][20]

在大多数上下文中,只需使用
数组
即可将其转换为指向其第一个元素的指针:
&(数组[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]);

您需要的是一个指针数组。因此
ptr\u array
的声明应该是

char *ptr_array[20];    // an array of 20 pointer-to-char
下面的代码使用
strcpy
填充
数组中的两个字符串。
{{0}
确保所有其他字符串都归零。然后声明
ptr_数组
并初始化所有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(无效)
{
字符数组[20][20]={{0};
strcpy(数组[0],“hello”);
strcpy(数组[1],“世界”);
char*ptr_数组[20];
对于(int i=0;i<20;i++)
ptr_数组[i]=数组[i];
printf(“%s\n”,ptr_数组[0]);
返回0;
}

ptr\u array
是指向char的指针。我看不出它在代码中做什么。您需要一个二维数组(它是
array
),或者一个指向指针的指针(实际上是
argv
)。只需从代码中删除
ptr\u array
,然后使用
array
printf(%s\n“,数组[1]);
应该可以正常工作。(另外,您似乎混淆了字符串和单个字符–请阅读关于C字符串和字符的基本教程,并阅读
printf()
)的手册页。我会按照建议做。敬请。感谢您的时间。但是有一个问题,为什么我们在int main中使用*argv(int argc,char*argv)?如果argc具有数组的所有属性,我不理解为什么我们将argv用作指针数组。@deeplglicious“argc具有数组的所有属性”是什么意思它不是。它只是一个
int
。它也不是
argv
,因为它不是数组,它是指向指针的指针。我们这样使用它,因为语言规范这么说(这是获取命令行参数的最实用的方法,因为它们的长度在编译时是未知的,所以不能说
argv
应该是指向已知大小数组的指针。)这仅仅是为了理解argv的应用。我不明白为什么我们使用argv作为指针数组。为什么它被定义为一个指针数组?为什么我们不能使用它作为一个非标准的字符argv,而不是将其编码为char*argv?@deepIglicious如果它是一个二维数组,则必须为每行指定一个最大长度,即u不必要的限制和浪费大量的资源memory@deepIglicious做了一次编辑来澄清这一点。这回答了你的问题吗?@Deepiglicios补充了一些解释。这在很多层面上都是错误的。你不断重复地将指针和数组合并。“argv
是一个字符数组数组”–不,它是指向指针的指针。这与数组数组不同。然后:“
array
现在是指向该数组中第一个元素的指针,因此它是一个
char*
”–不,它是一个由10个字符组成的数组,或者是一个
char[10]
。它可能会退化为指向其第一个元素的指针,但它本身不是指针。
argv
指向的字符串是可写的,因此这并不完全正确