我有一个任务,我将一个字符串传递给一个函数
[原型]char *get_word( char **string_ptr);
当传递的字符串时,我的 main 将停止调用该函数
指向“/0”字符。
区分一个 string 和一个指向 (字符串的第一个字符,它是字符串传递给函数并从函数返回的方式,通常也是一般访问字符串的方式。指向字符串第一个字符的char * 独立于字符串本身。因此,您的陈述仅在解释为“当传递地址的指针变量的值指向字符串的'/0'字符时,我的 main 将停止调用函数”时才有意义。
因此我必须实现这一行
函数内部:*string_ptr += strlen( *string_ptr );
这确实会更新string_ptr 指向的地址处的指针值,使其指向最初指向的字符串的终止符。然而,我倾向于假设这 不是 你真正想要的,因为这样就不需要多次调用该函数。如果函数无条件执行该语句,则传递的指针将始终指向仅在一次调用之后的终止符。
这让我很困惑。我的印象是
*string_ptr 将是函数中传递的字符串。那么增加它的价值意味着什么?
*string_ptr 是 string_ptr 指向的任何内容。根据您提供的声明,这将是一个char * 类型的指针。记住:区分这样的指针和它指向的事物(在这种情况下是字符串的第一个字符)是很重要的。增加指针的值只是使它指向字符串中的某个后面的字符(只要你不增加太多)。如果你将它增加字符串中字符的全部计数,那么它将指向终止符。
另一个问题。如果**string_ptr 是一个字符串数组,那么什么
是 *string_ptr 还是 string_ptr 自己?
被视为表达式,*string_ptr 和 **string_ptr 脱离上下文毫无意义。但是,根据您提供的声明,表达式*string_ptr 的计算结果为string_ptr 指向的char *。表达式**string_ptr 的计算结果是string_ptr 指向的char * 指向的char。 string_ptr 本身就是函数参数的值,它被声明为指向char 的指针。
但我认为您实际上是在询问函数原型,在这种情况下,您问错了问题。通常的问题是关于参数string_ptr 的类型(char **)是否代表一个字符串数组。答案在几个层面上都是“不”,至少在一个层面上是“也许,有点”。
从表面上看,char ** 类型表示指向 char 指针的指针。这个可以是指向char * 数组中第一个char * 的指针,如果您将这样的数组作为相应的参数,这就是它的样子。但是,无法确定指向的char * 是否是数组的成员,如果是,则不会传达有关该数组长度的信息。这种指向单个标量char * 的指针与指向char * 的单成员数组的第一个也是唯一一个元素之间没有有意义的区别。
当然,同样的区别也适用于下一层。一个有效的char * 经常 指向一个字符串的第一个char,但你不能仅从类型中知道这一点。假设这样的指针是有效的,它可能会指向一个未终止的char 数组,或者指向一个单一的标量char。特别是对于char * 类型,它也可能指向(入)任何其他类型对象值的原始字节。