【问题标题】:Increasing Value of Array of Strings in CC中字符串数组的增加值
【发布时间】:2018-11-28 19:16:37
【问题描述】:

我有一个任务,我将一个字符串传递给一个定义为char *get_word( char **string_ptr);的函数

当传递的字符串指向 '\0' 字符时,我的 main 将停止调用该函数。因此我必须在函数内部实现这一行:*string_ptr += strlen( *string_ptr );

这让我很困惑。我的印象是*string_ptr 将是函数中传递的字符串。那么增加它的价值意味着什么?

另一个问题。如果**string_ptr 是一个字符串数组,那么*string_ptr 或只是string_ptr 是什么?

【问题讨论】:

    标签: c pointers memory dynamic-memory-allocation


    【解决方案1】:

    首先,**string_ptr 在语义上并不能保证string_ptr 将是一个字符串数组或一个字符指针数组。处理完内存管理后,这一点就很清楚了。

    据我所知,您正在向您的函数传递一个指向字符串的指针。 所以你做这样的事情

    char* string = "my string in read-only memory";
    
    foo(&string);
    

    要访问指针指向的字符串的值,请取消引用指针,然后取消引用字符串。这将解析为字符串的第一个字符。

    **string_ptr 是字符串的第一个字符。

    *string_ptr 是字符串

    string_ptr 是指向字符串的指针。


    有更清晰或至少更容易理解的方式来做你想要实现的目标:

    char* p = *string_ptr;
    
    for(char* p = *string_ptr; *p != '\0' p++);
    

    创建指向字符串的新指针

    然后递增它直到它指向保存\0的地址


    在变量中添加更多* 只是意味着它指向另一个东西。

    char* ch; // ch points to char or string
    char** ch; // ch points to char*
    char*** ch; // ch points to char**
    

    等等


    *string_ptr 将是函数中传递的字符串。那么增加它的价值意味着什么?

    你是对的。 增加指针的值通常意味着对变量执行指针算术。本质上它与增加常规变量相同,但这次是在地址值上执行的,其中增加 1 意味着增加 1 * sizeof(type)

    我演示了递增指针是什么以及它的作用。


    *string_ptr += strlen( *string_ptr );

    因为*string_ptr 是字符串偏移量 这将使您的字符串指向自身的末尾。 因此,如果您在此之前获得它的额外参考会很好。

    【讨论】:

      【解决方案2】:

      我有一个任务,我将一个字符串传递给一个函数 [原型]char *get_word( char **string_ptr);

      当传递的字符串时,我的 main 将停止调用该函数 指向“/0”字符。

      区分一个 string 和一个指向 (字符串的第一个字符,它是字符串传递给函数并从函数返回的方式,通常也是一般访问字符串的方式。指向字符串第一个字符的char * 独立于字符串本身。因此,您的陈述仅在解释为“当传递地址的指针变量的值指向字符串的'/0'字符时,我的 main 将停止调用函数”时才有意义。

      因此我必须实现这一行 函数内部:*string_ptr += strlen( *string_ptr );

      这确实会更新string_ptr 指向的地址处的指针值,使其指向最初指向的字符串的终止符。然而,我倾向于假设这 不是 你真正想要的,因为这样就不需要多次调用该函数。如果函数无条件执行该语句,则传递的指针将始终指向仅在一次调用之后的终止符。

      这让我很困惑。我的印象是 *string_ptr 将是函数中传递的字符串。那么增加它的价值意味着什么?

      *string_ptrstring_ptr 指向的任何内容。根据您提供的声明,这将是一个char * 类型的指针。记住:区分这样的指针和它指向的事物(在这种情况下是字符串的第一个字符)是很重要的。增加指针的值只是使它指向字符串中的某个后面的字符(只要你不增加太多)。如果你将它增加字符串中字符的全部计数,那么它将指向终止符。

      另一个问题。如果**string_ptr 是一个字符串数组,那么什么 是 *string_ptr 还是 string_ptr 自己?

      被视为表达式,*string_ptr**string_ptr 脱离上下文毫无意义。但是,根据您提供的声明,表达式*string_ptr 的计算结果为string_ptr 指向的char *。表达式**string_ptr 的计算结果是string_ptr 指向的char * 指向的charstring_ptr 本身就是函数参数的值,它被声明为指向char 的指针。

      但我认为您实际上是在询问函数原型,在这种情况下,您问错了问题。通常的问题是关于参数string_ptr 的类型(char **)是否代表一个字符串数组。答案在几个层面上都是“不”,至少在一个层面上是“也许,有点”。

      从表面上看,char ** 类型表示指向 char 指针的指针。这个可以是指向char * 数组中第一个char * 的指针,如果您将这样的数组作为相应的参数,这就是它的样子。但是,无法确定指向的char * 是否是数组的成员,如果是,则不会传达有关该数组长度的信息。这种指向单个标量char * 的指针与指向char * 的单成员数组的第一个也是唯一一个元素之间没有有意义的区别。

      当然,同样的区别也适用于下一层。一个有效的char * 经常 指向一个字符串的第一个char,但你不能仅从类型中知道这一点。假设这样的指针是有效的,它可能会指向一个未终止的char 数组,或者指向一个单一的标量char。特别是对于char * 类型,它也可能指向(入)任何其他类型对象值的原始字节。

      【讨论】:

        猜你喜欢
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 2013-05-12
        • 2021-07-17
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多