char * argv []是指针数组或char字符串数组

时间:2019-07-06 02:19:13

标签: c argv

据我到目前为止的了解, char * argv[] = {"abc", "def"}; 初始化2个char指针的数组。第一个指向"abc",第二个指向"def"。名称argv也是一个指向数组argv中第一个指针的指针。

为什么有人说argvchar个字符串的数组? (例如K&R的C编程语言)。它们不是指char的指针数组,本书也对此进行了解释。

如果我的假设正确,则%s中的printf("%s", argv[1])根本就不会期望char string,而是指向char string的指针?

感谢您的耐心!

我读过的东西:

Pointer to Pointer with argv

C: Accessing the second argv via a pointer

2 个答案:

答案 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或一元&的操作数时,将其作为数组进行操作。 (此外,当使用字符串文字初始化数组时,会将字符串文字用作数组。)除这些情况外,当在表达式中使用数组时,会将其转换为指向其第一个元素的指针。这种转换是自动的,非常普遍,以至于学生可能将数组或数组的名称误认为要转换为的指针。那是一个错误。该数组不是指针。

  

为什么有人说argvchar个字符串的数组? (例如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(或printfchar *),该数组中的字符被写到(但不包括)终止的空字符。字符串的字符。

答案 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);
}