我有一个分配,其中我将字符串传递到定义为Traceback (most recent call last):`
File "C:/Users/Soham Pal/Desktop/dec_to_octal.py", line 8, in <module>
d=nthroot(c)
NameError: name 'c' is not defined
当传递的字符串指向char *get_word( char **string_ptr);
字符时,我的main将停止调用该函数。因此,我必须在函数'\0'
这让我很困惑。我的印象是*string_ptr += strlen( *string_ptr );
是在函数中传递的字符串。那么,增加价值将意味着什么呢?
另一个问题。如果*string_ptr
是一个字符串数组,那么**string_ptr
或仅是*string_ptr
本身是什么?
答案 0 :(得分:3)
首先,join()
从语义上不能保证**string_ptr
将是字符串数组或char指针数组。处理内存管理后,这一点很明显。
据我所知,您正在向函数传递指向字符串的指针。 所以你要做类似的事情
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
只是意味着它指向另一件事。
*
以此类推
* string_ptr将是在函数中传递的字符串。那么,增加它的价值意味着什么?
您对此表示正确。
指针值的增加通常意味着对变量执行指针算术。从本质上讲,它与增加常规变量相同,但是这次是对一个地址值执行的,其中地址1的增加意味着char* ch; // ch points to char or string
char** ch; // ch points to char*
char*** ch; // ch points to char**
我演示了什么是增量指针及其作用。
1 * sizeof(type)
因为*string_ptr += strlen( *string_ptr );
是字符串偏移量
这会使您的字符串指向其结尾。
因此,如果您在此之前获得更多参考,那就太好了。
答案 1 :(得分:1)
我有一个分配,其中我将字符串传递给函数 [原型]
char *get_word( char **string_ptr);
我的主程序在传递字符串时将停止调用该函数 指向“ / 0”字符。
重要的是要区分 string 和 pointer ,其中 string 是char
的以空终止的 array 。到字符串的第一个字符,即如何将字符串传送到函数并从函数返回,以及通常通常如何访问字符串。指向字符串第一个字符的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
的计算结果为char *
指向的string_ptr
。表达式**string_ptr
的计算结果为char
所指向的char *
所指向的string_ptr
。 string_ptr
本身只是函数参数的值,该参数的值声明为指向char
的指针。
但是我认为您实际上是在询问函数原型,在这种情况下,您提出了错误的问题。常见的问题是参数char **
的类型(string_ptr
)是否表示字符串数组。答案在几个级别上是“否”,而至少一个级别上是“也许”。
表面上,类型char **
表示一个指向char的指针。此可以是指向char *
数组中第一个char *
的指针,如果您将这样的数组作为相应的参数出现,则将是这样。绝对不能确定指向的char *
是数组的成员,如果是,则不会传送有关该数组长度的任何信息。指向单个标量char *
的指针和指向char *
的单成员数组的第一个也是唯一元素的指针之间没有有意义的区别。
当然,同一区别适用于下一级。有效的char *
经常指向字符串的第一个char
,但是您不能单凭类型知道这一点。假设这样的指针是有效的,它可能指向char
的无终止数组,或者指向单个标量char
。特别是对于类型char *
,它也可能指向任何其他类型的对象的值的原始字节。