【问题标题】:When printf a string we are not using *. Why?当 printf 一个字符串时,我们没有使用 *.为什么?
【发布时间】:2019-06-07 06:07:04
【问题描述】:

在 c 编程中当我们打印一个字符串时。我们没有使用 * 。但是当使用 printf 打印数字时,我们使用 *.那么它是如何理解的,我正在打印一个字符串或整数。理解使用 %s 运算符吗?

附上示例代码

#include<stdio.h>

int main(int argc,char* argv){

char data[]="This is an example of pointer";
char *pointerstringdata =data;
printf("print the string data is >> %s\n",pointerstringdata);   /* Here we are not using * why?  case -1*/


int numberdata =100;
int *pointerintdata=&numberdata;
printf("print the int data is >> %d\n",*pointerintdata);   /* Here we are  using * why?  case -2*/
return 0;
}

【问题讨论】:

  • 为什么会被否决?
  • 您可以printf("%d", numberdata)printf("%d", *pointerintdata)。第一个是直接从变量传递数据,第二个是传递相同的数据但通过指针访问。但是,%s 格式说明符需要一个指针,而不是一个值,因此您传递的是一个指针 pointerstringdata
  • @weather vane 感谢您的回复。我的问题是在两种数据类型之间。对于数字,我了解 numberdata *pointerintdata 之间的区别。对于打印数字,我们使用 *pointerintdata。为什么不是字符串?这就是为什么要提问。
  • 您需要查找 printf 的格式说明符。 %s 需要一个指针,%d 需要一个(整数)VALUE。
  • @Vipin 在 C 中没有数据类型“字符串”。您可能想了解在 C 中如何使用 char 数组来模拟“字符串”,以及数组如何与/不同一般的指针。

标签: c string printf c-strings conversion-specifier


【解决方案1】:

char data[]="This is an example of pointer";
char *pointerstringdata =data;
printf("print the string data is >> %s\n",pointerstringdata);   /* Here we are not using * why?  case -1*/

如果你想打印你必须给出它的地址的所有字符串,不要*

如果要打印它的第一个字符,请执行 `printf("%c", *pointerstringdata);


int numberdata =100;
int *pointerintdata=&numberdata;
printf("print the int data is >> %d\n",*pointerintdata);   /* Here we are  using * why?  case -2*/

您不想打印pointerintdata 中记忆的地址,但该地址中的值相同,因此您必须取消引用

与字符串没有区别......除了你想写所有字符串

指针是指针,无论它是指向 char 的指针还是指向 int 的指针

【讨论】:

  • 非常感谢。我明白了。
【解决方案2】:

当我们打印一个字符串时。我们没有使用 * 。但是当使用 printf 打印数字时,我们使用 *

因为d 转换说明符需要一个int,而s 转换说明符需要一个指针(指向char 和@987654325 的第一个元素@-terminated char 数组,实际上是 C 用来模仿通常称为“字符串”的东西。

【讨论】:

    【解决方案3】:

    %s 格式说明符需要一个指针。

    如果您传递*pointerstringdata,该函数将接收数组中的第一个字符,该函数将尝试取消引用,并可能导致崩溃。

    【讨论】:

      【解决方案4】:

      因为指针持有对对象的引用。 * 取消引用此对象。因此,如果当我们取消引用它时指针持有对 char 对象的引用,我们就会得到这个对象。所以取消引用 char 指针只是单个 char 而不是字符串中第一个 char 的地址。

      【讨论】:

        【解决方案5】:

        C 语言没有将字符串视为值的规定。您不能将字符串传递给函数。指针pointerstringdata 只是一个指向char 的指针,所以*pointerstringdata 是一个char,而不是一个字符串。传递*pointerstringdata 只会传递一个字符,而不是字符串。

        要打印字符串,当使用%s 时,printf 期望参数是一个指针。它使用这个指针从内存中读取,并读取并打印字符,直到找到空字符。

        相比之下,C 确实支持将数字视为值,因此它们可以直接传递给函数。

        【讨论】:

        • 好答案,你在我写我的同时写了我的答案的简短版本,你把它归结为重点,我倾向于解释很多。 +1
        【解决方案6】:

        免责声明:这是对开发人员的解释,而不是编译代码后的样子(特别是因为优化器可能会全部更改)。


        C 是一种非常低级的语言。您需要了解变量总是包含几个字节的值。

        C 也是一种可以非常方便地访问大型结构的语言。

        变量的内容可以是:

        • 一个值(例如:你提到的一个数字)
        • RAM 中的地址
        • 一种使用更多连续 ram 的结构(而 C 使它很好地使用它,就好像它不止于此一样)
          • stuct(固定长度)
          • 固定长度的数组

        没有将动态长度变量作为值的真正概念,因此字符串以及动态长度的数组只有变量中的地址。

        由于字符串是可变长度的,C 中的约定是:

        • 在变量中有地址
        • 从该地址开始逐字节读取真实数据
        • 读取数据直到字节为 0 (NULL)

        这叫做null-terminated string

        这样你可以将可变长度的数据传递给printf,printf会通过查找第一个字节为0来找出长度。

        将包含地址的变量转换为包含值的变量如下所示:
        var_with_value = *var_with_address
        var_with_address = &amp;var_with_value

        “var_with_address”称为指针。

        结论:您需要将字符串作为地址而不是值传递,数字作为值而不是地址传递,这就是您必须使用*的区别

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 2020-09-08
          相关资源
          最近更新 更多