据我到目前为止的了解,
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
的指针?
感谢您的耐心!
我读过的东西:
答案 0 :(得分:0)
在C标准中,“ A string 是连续的字符序列,这些字符以第一个空字符结尾,并包括第一个空字符”(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编程语言)。
在索引的argv
中列出的任何位置的 C编程语言的任何一个版本中,Kernighan和Ritchie均未说过。在1978年的第一版中,他们在第110页上说:“第二个(argv
)指向包含参数的字符串数组的指针,每个字符串一个。”在1988年的第二版中,他们说在第114页上,“第二个(argv
,用于参数向量)是指向包含参数的字符串数组的指针,每个字符串一个。”索引还列出了argv
的页面163,但是那里只是偶然提及,程序名称引用argv[0]
。
请注意,它们将argv
称为指针而不是数组。这是因为argv
的{{1}}参数是一个指针。尽管可以使用main
进行声明,但是声明为数组的参数会自动调整为指针。因此,int main(int argc, char *argv[])
声明中的char *argv[]
将main
定义为与您显示的语句argv
不同。在参数声明中,它会自动调整为指针。在单独的定义中,它是一个数组。
尽管Kernighan和Ritchie确实将char * argv[] = {"abc", "def"};
称为指针,而不是您所写的数组,但他们说这是“指向数组的指针”。这也是草率的术语。其类型是指向argv
的指针,而不是指向char
的指针的数组。仅在指向char
数组的第一个元素的意义上,它才是数组的指针。
如果我的假设正确,则
char
中的%s
根本就不会期望printf("%s", argv[1])
,而是指向char string
的指针?
根据C 2018 7.21.6.1 8,对于没有修饰符或精度的char string
的{{1}}指示符,“参数应为指向字符类型数组初始元素的指针。因此,应该传递一个指向首字母的s
(或printf
或char *
),该数组中的字符被写到(但不包括)终止的空字符。字符串的字符。
答案 1 :(得分:0)
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);
}