C 一个字符指针如何是一个完整的字符串?
假设我有以下字符串:C 一个字符指针如何是一个完整的字符串?,c,string,pointers,char,char-pointer,C,String,Pointers,Char,Char Pointer,假设我有以下字符串: char *my_string = "Stack"; 据我所知,char*保存字符串“Stack”的第一个字符的内存地址。在计算机内存中,它可能表示为以下内容: ------------------------ | S | t | a | c | k | \0| ------------------------ ^ my_string 如果我调用:printf(“%s\n”,我的\u字符串),则打印整个字符串。编译器如何知道打印整个字符串?因为据我所知,它只
char *my_string = "Stack";
据我所知,char*
保存字符串“Stack”
的第一个字符的内存地址。在计算机内存中,它可能表示为以下内容:
------------------------
| S | t | a | c | k | \0|
------------------------
^
my_string
如果我调用:
printf(“%s\n”,我的\u字符串)代码>,则打印整个字符串。编译器如何知道打印整个字符串?因为据我所知,它只有一个字符的地址。字符*
确实只指向字符串的第一个字符,但是像printf(“%s”)
这样的函数只需开始读取并继续,直到找到一个0字节。默认情况下,字符串文本(如“Stack”
示例)以零结尾,因此printf
将知道打印字符串并在打印后停止。字符*确实只指向字符串的第一个字符,但函数类似于printf(“%s”)
只需开始读取并继续,直到找到一个0字节。默认情况下,字符串文本(如“Stack”
示例)以零结尾,因此printf
将知道打印字符串并在之后停止。因为它知道字符有多大,所以它可以计算第二个字符的地址并打印它(基本上是在原始指针上添加1)。然后,它可以再次执行相同的操作以获得第三个字符,依此类推,直到找到一个值为'\0'
的字符,并且字符串被视为结束。因为它知道一个字符有多大,所以它可以计算第二个字符的地址并打印它(基本上通过在原始指针上添加1)。然后,它可以再次执行相同的操作,以获得第三个字符,依此类推,直到找到一个值为'\0'
的字符,并且字符串被视为结束。编译器除了编译程序外,不会执行任何操作
但是,库函数
printf
对您提出了以下要求(您恰好满足了这一要求):当给定格式说明符%s
时,相应的参数必须是char*
类型,并假定指向以零结尾的字符数组的第一个元素。然后,该函数将打印出该数组的连续元素,直到它达到零字节。编译器除了编译您的程序外,不会执行任何操作
但是,库函数
printf
对您提出了以下要求(您恰好满足了这一要求):当给定格式说明符%s
时,相应的参数必须是char*
类型,并假定指向以零结尾的字符数组的第一个元素。然后,该函数将打印此数组的连续元素,直到它到达零字节。char*
只是一个指向字符串开头的指针。许多C函数(printf、strcpy、strlen等)依赖于传递给它们的指针恰好指向的字符串末尾的终止'\0'
。在将指向字符串的指针传递给此类函数时,请始终记住使用'\0'
终止字符串,以避免未定义的行为、分段错误、访问冲突等。char*
只是指向字符串开头的指针。许多C函数(printf、strcpy、strlen等)依赖于传递给它们的指针恰好指向的字符串末尾的终止'\0'
。在向此类函数传递字符串指针时,请始终记住使用“\0”终止字符串,以避免未定义的行为、分段错误、访问冲突等。char*my_string=“Stack”;
这意味着以下几点:
如果您用任何其他内容覆盖普通字符串的“\0”地址,它将继续打印,直到遇到“\0”(一种引发网络攻击的技术)。编译器不知道传递的变量地址的大小或类型,因此当您传递字符的第一个地址时,请使用字符串的说明符
%s
,编译器唯一知道的是传递的地址,它必须将地址转换并解释为字符串。因此,通常printf会打印所有字符,并在读取\0
空指针时结束执行。字符串基本上只是以空指针结尾的字符集合\0
编译器不知道传递的变量地址的大小或类型,因此当传递字符的第一个地址时,使用字符串的说明符%s
,编译器唯一知道的是传递的地址,它必须将地址转换并解释为字符串。因此,通常printf会打印所有字符,并在读取\0
空指针时结束执行。字符串基本上只是以空指针结尾的字符集合。\0
该%s
说明:打印所有字符,直到找到一个'\0'
编译器不打印字符串,printf
打印字符串。它通过一次打印一个字符来实现,直到达到NUL。很难看出你在这方面有什么困难。你的地址识别你整个房子的方式是一样的,而不仅仅是前门。%s
上说:打印所有字符直到你找到为止