[英]char * argv[] is an array of pointers or array of char strings
根据我目前的理解, char * argv[] = {"abc", "def"};
初始化一个由 2 个char
指针组成的数组。 第一个指向"abc"
,第二个指向"def"
。 名称argv
也是一个指针,指向数组argv
的第一个指针。
为什么有人说argv
是一个char
字符串数组呢? (就像在 K&R 的 C 编程语言中一样)。 难道它们不是指指向char
的指针数组,这本书也解释了这一点。
如果我的假设是正确的, %s
中printf("%s", argv[1])
不期待一个char string
所有,而是一个指向char string
?
谢谢你的耐心!
我读过的东西:
正如 C 标准中使用的那样,“字符串是由第一个空字符终止并包括第一个空字符的连续字符序列”(C 2018 7.1.1 1)。 它不是char *
。 char *
可能指向字符串的第一个字符,有时在 C 标准中被称为指向字符串的指针,但这是草率的术语,因为char *
必然是指向字符的指针 - 没有技术定义关于指向“序列”的含义,尽管我们可能认为它意味着指向序列的第一个元素。
根据我目前的理解,
char * argv[] = {"abc", "def"};
初始化一个由 2 个char
指针组成的数组。
那是正确的。
名称
argv
也是一个指针,指向数组argv
的第一个指针。
鉴于问题中argv
的定义,这是不正确的。 定义char * argv[] = {"abc", "def"};
将argv
定义为char *
数组。 它不是指针。
当数组用作sizeof
或一元&
的操作数时,它作为数组进行操作。 (此外,当数组用字符串字面量初始化时,字符串字面量用作数组。)除此之外,当在表达式中使用数组时,它会被转换为指向其第一个元素的指针。 这种转换是自动的,而且很常见,以至于学生可能会将数组或数组的名称误认为是它被转换为的指针。 那是一个错误。 数组不是指针。
为什么有人说
argv
是一个char
字符串数组呢? (就像在 K&R 的 C 编程语言中一样)。
Kernighan 和 Ritchie 在The C Programming Language 的任一版本中都没有在索引中为argv
列出的任何地方argv
这一点。 在 1978 年的第一版中,他们在第 110 页说“第二个 ( argv
) 是一个指向包含参数的字符串数组的指针,每个字符串一个。 在 1988 年的第二版中,他们在第 114 页说“第二个( argv
,表示参数向量)是一个指向包含参数的字符串数组的指针,每个字符串一个。” 该索引还列出了argv
第 163 页,但那里只是偶然提到的,指的是argv[0]
为程序名称。
请注意,它们将argv
称为指针而不是数组。 这是因为, argv
参数main
是一个指针。 尽管可以使用int main(int argc, char *argv[])
声明,但声明为数组的参数会自动调整为指针。 因此, main
声明中的char *argv[]
将argv
定义为与您显示的语句不同的内容, char * argv[] = {"abc", "def"};
. 在参数声明中,自动调整为指针。 在单独的定义中,它是一个数组。
尽管 Kernighan 和 Ritchie 确实将argv
称为指针,而不是您写的数组,但他们说它是“指向数组的指针”。 这也是草率的术语。 它的类型是pointer-to-pointer-to- char
,而不是pointer-to-array-of- char
。 它只是一个指向数组的指针,因为它是指向char
数组的第一个元素的指针。
如果我的假设是正确的,
%s
中printf("%s", argv[1])
不期待一个char string
所有,而是一个指向char string
?
根据 C 2018 7.21.6.1 8,对于没有修饰符或精度的printf
的s
说明符,“参数应是指向字符类型数组的初始元素的指针。 数组中的字符被写入(但不包括)终止的空字符。” 因此,应该传递指向字符串初始字符的char *
(或有signed char *
或unsigned char *
)。
Char **argv 指向一个参数,以及该参数中的一个字符。
例子:
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* temp.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: albarret <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/05 20:14:37 by albarret #+# #+# */
/* Updated: 2019/07/05 20:17:41 by albarret ### ########.fr */
/* */
/* ************************************************************************** */
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
int main(int argc, char **argv)
{
int i;
i = 0;
if (argc < 2)
{
write(1, "\n", 1);
return (0);
}
while (argv[1][i])
{
ft_putchar(argv[1][i]);
i++;
}
write(1, "\n", 1);
return (0);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.