如何创建类似char*argv的char指针
C语言中使用的命令行指针char*argv[]允许以下操作:如何创建类似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代码中创建一个允许类似操作的指针
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
指向的字符串是可写的,因此这并不完全正确