Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 一个字符指针如何是一个完整的字符串?_C_String_Pointers_Char_Char Pointer - Fatal编程技术网

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”; 这意味着以下几点:

  • my_字符串是指向字符的指针
  • 指针递增时,它将增加sizeof(char)
  • 正如大多数人所引述的那样,在其基础上增加了一个观察: 如果您用任何其他内容覆盖普通字符串的“\0”地址,它将继续打印,直到遇到“\0”(一种引发网络攻击的技术)。

    char*my_string=“Stack”; 这意味着以下几点:

  • my_字符串是指向字符的指针
  • 指针递增时,它将增加sizeof(char)
  • 正如大多数人所引述的那样,在其基础上增加了一个观察:
    如果您用任何其他内容覆盖普通字符串的“\0”地址,它将继续打印,直到遇到“\0”(一种引发网络攻击的技术)。

    编译器不知道传递的变量地址的大小或类型,因此当您传递字符的第一个地址时,请使用字符串的说明符
    %s
    ,编译器唯一知道的是传递的地址,它必须将地址转换并解释为字符串。因此,通常printf会打印所有字符,并在读取
    \0
    空指针时结束执行。字符串基本上只是以空指针结尾的字符集合
    \0

    编译器不知道传递的变量地址的大小或类型,因此当传递字符的第一个地址时,使用字符串的说明符
    %s
    ,编译器唯一知道的是传递的地址,它必须将地址转换并解释为字符串。因此,通常printf会打印所有字符,并在读取
    \0
    空指针时结束执行。字符串基本上只是以空指针结尾的字符集合。
    \0

    %s
    说明:打印所有字符,直到找到一个
    '\0'
    编译器不打印字符串,
    printf
    打印字符串。它通过一次打印一个字符来实现,直到达到NUL。很难看出你在这方面有什么困难。你的地址识别你整个房子的方式是一样的,而不仅仅是前门。
    %s
    上说:打印所有字符直到你找到为止