男人,指针继续给我带来麻烦。我以为我理解了这个概念。(基本上,当你想操纵ptr指向的位置保存的实际内存时,你会使用* ptr。如果你想通过做这样的事情来移动指针,你会使用ptr作为ptr ++或ptr--。)所以,如果是这种情况,如果你使用星号来操纵指针所指向的文件,这是如何工作的:
char *MallocAndCopy( char *line ) {
char *pointer;
if ( (pointer = malloc( strlen(line)+1 )) == NULL ) {
printf( "Out of memory!!! Goodbye!\n" );
exit( 0 );
}
strcpy( pointer, line );
return pointer;
}
malloc返回一个指针,所以我理解为什么if条件中的“指针”不使用星号。但是,在strcpy函数中,它将行的CONTENTS发送到指针的CONTENTS。不应该是:
strcpy( *pointer, *line);
?????或者我对指针的理解是正确的,这只是strcpy函数的工作方式吗?
答案 0 :(得分:6)
C样式字符串是字符字节数组。当您将数组作为指向数组类型的指针传递时,指针包含数组的第一个元素的地址。
strcpy
函数将指针指向源数组的第一个char
(字符串的开头)和指向目标数组中第一个char
的指针,并遍历源,直到它到达'\0'
字符,终止字符串。
这也是为什么当你调用malloc
时,你传递给它的大小是strlen(line)+1
,因为你需要为终止字符再分配一个字节(据我所知)。 / p>
答案 1 :(得分:4)
char* strcpy(char *destination, const char *source)
是strcpy
的签名。它希望得到指针作为参数。在您的实例中,pointer
已经是指针,line
也是如此。
strcpy
将使用指针source
和destination
,并将指向source
的基础字节复制到destination
,直到它遇到\0
在source
指向的字符串中的1}}(NULL)字节,或者如果它因为从未遇到该字节(未终止的字符串)并且只是读入深渊而发生分段错误。
如果你使用*pointer
,你实际上会取消引用指针并在指针所指向的地址处获得char
。
答案 2 :(得分:1)
strcpy的签名是
char * strcpy ( char * destination, const char * source );
您正在发送指向char *的指针,以及也是char *的行。因此,您完全按预期匹配签名。发送*指针或*行将发送'这些指针指向的值' - 这将是错误的。
答案 3 :(得分:1)
scrcpy接受一个指针,并将内容写入指向另一个指针所指向的位置。这就像重写表格中的单元格内容一样。您不一定要剪切和粘贴表的一部分,您可以重写其中的数字。在这种情况下,指针只是提示您必须触摸的单元格。
答案 4 :(得分:1)
查看strcpy()的声明。
char *strcpy(
char *strDestination,
const char *strSource
);
您需要传递指针。因此,您不要取消引用指针和行。因为那会传递一个字符。
答案 5 :(得分:1)
*
位于strcpy
内。
应用*
运算符称为解除引用,与应用[0]
完全相同。
strlen
和strcpy
需要知道字符串的开始位置,以便他们可以访问所有元素,而不仅仅是第一个元素。
pointer
的类型为char *
,*pointer
的类型为char
,表示没有相邻字符概念的单个字符。
答案 6 :(得分:1)
通过编写*pointer
,您可以获得它指向的字符(恰好是pointer
表示的字符串的第一个字符)。将其传递给strcpy
涉及创建该角色的副本。 strcpy
不可能知道它应该写在哪里,除非你给它一个指向那个数据的指针。
以类似的方式,通过提供*line
,您只给strcpy
一个字符串第一个字符的副本。
所以,你基本上是在说:
我有两个字符串。我没有把它们交给你。一个的第一个字母是C,另一个的第一个字母是μ。将第一个内容复制到第二个
答案 7 :(得分:0)
我知道您希望将*pointer
和*line
传递给strcpy
的原因。但请记住pointer
指向内存中存储内容的位置以及保留和分配strlen(line)+1
字节内存的位置。因此strcpy
正在做的是将strlen(line)
字节的内存从地址line
开始复制到相应的位置,从pointer
的地址开始。如果您通过*pointer
和*line
,则strcpy
只能访问第一个char
,而不能访问其他strlen(line)-1
。希望澄清你对指针的困惑以及为什么我们需要将指针传递给strcpy
。
答案 8 :(得分:0)
您对strcpy
的基本理解是正确的。该函数确实将line
的内容复制到pointer
的内容上。但是,您必须将指针传递给函数而不是数据本身。这样做有几个原因。
首先,正在复制的数据是字符串(即数组),而不是常规变量。将数组传递给函数时,不能将整个数组塞入单个函数参数中,因此必须将指针传递给数组的开头。这是C中传递数组的限制,并不是strcpy
特有的。
此外,将数据传递给函数会为函数提供变量内容的副本。如果您直接将数据(或取消引用的指针)传递给strcpy
,则该函数将使用副本而不是原始数据。它将无法将数据写入原始字符串。
基本上,通过将指针移交给strcpy
,您可以告诉它源数据和目标的位置。该函数在内部处理所有的解引用。在人类语言中,对strcpy
的调用可以被认为是“从内存地址line
开始的字符串,并从内存地址pointer
开始写一个副本”。要传递内存地址,请使用指针。
答案 9 :(得分:0)
将strcpy代码视为:
char * strcpy(char * dst, char* src)
{
int i = 0 ;
for (;dst[i]=source[i++];);
return dst ;
}
\ 0(NULL)是字符串和for循环的结束。
答案 10 :(得分:0)
您的功能基本上是strdup
的功能。该函数在许多平台上定义,如果不是,您可以这样定义:
char * my_strdup(const char* s)
{
size_t len = strlen(s);
char *r = malloc(len+1);
return r ? memcpy(r, s, len+1) : NULL;
}
对于更长的字符串,memcpy通常比strcpy更快。