繁体   English   中英

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

[英]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的指针数组,这本书也解释了这一点。

如果我的假设是正确的, %sprintf("%s", argv[1])不期待一个char string所有,而是一个指向char string

谢谢你的耐心!

我读过的东西:

使用 argv 指向指针的指针

C:通过指针访问第二个 argv

正如 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数组的第一个元素的指针。

如果我的假设是正确的, %sprintf("%s", argv[1])不期待一个char string所有,而是一个指向char string

根据 C 2018 7.21.6.1 8,对于没有修饰符或精度的printfs说明符,“参数应是指向字符类型数组的初始元素的指针。 数组中的字符被写入(但不包括)终止的空字符。” 因此,应该传递指向字符串初始字符的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM