在C语言的命令行参数中,我们可以将参数向量指定为char *argv[]char **argv 我理解第一种类型,它是一个指向字符的指针数组,但是指向字符的指针数组和第二种类型之间有什么关系呢?

推荐答案

char *argv[]%和char **argv%的区别在于:

  • char *argv[]是由char *个指针组成的array.

  • char **argv是指向另一个指向char的指针的指针.

char *argv[]可以这样想象:

p1 -> "hello"   
p2 -> "world"  
p3 -> "!"

// p1, p2 and p3 are 
// pointers to strings
// they have type char *
 _________________
 |  p1| p2 | p3  |     
 —————————————————
// argv looks like this
// it is an array of all the pointers

当在表达式中引用数组argv的名称时,它将产生指向数组中第一个元素的指针.

在表达式中使用时,数组名称argv的类型为char **.这是因为:

  • 数组名称argv衰减为指向数组的第一个元素的指针.

  • 第一个元素碰巧也是一个指针,因此argv本质上是指向另一个指针的指针,因此类型为char **

C++相关问答推荐

C sscanf没有捕获第二个参数

编译SDL 2时缺少SDL_ttf

C语言中字符数组声明中的标准

自定义应用程序上的日志(log)轮换问题

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

&;(str[i])和(&;str)[i]有什么区别?

Square不与Raylib一起移动

C指针概念分段故障

用C++构建和使用DLL的困惑

为什么我在C代码中得到一个不完整的类型?

我正在try 将QSORT算法实现为C++中的泛型函数

使用正则表达式获取字符串中标记的开始和结束

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

C中的空指针是什么(_N)?

UpDown控制与预期相反

模仿 memmove 的行为

如何正确探测平台设备?

nullptr_t 是否会 destruct 类型双关或指针转换?