【问题标题】:I am pretty curious about char pointers我对 char 指针很好奇
【发布时间】:2013-05-16 17:19:31
【问题描述】:

我了解到 char *p 的意思是“指向 char 类型的指针”

而且我想我也知道 char 意味着阅读

该指针到达其目的地后的内存量。

最终,在

char *p = "hello World";

p 包含字符串的地址和

p 正指向它

问题。

  1. 如果 p 指向字符串,它不应该只读取 'h' 吗? 因为它只读取一个字符的大小?
    为什么 `printf("%s", p) 打印整个字符串???

  2. 我还在 Rithcie 的书中了解到,指针变量不具有数据类型。 真的吗???

【问题讨论】:

  • printf("%s", *p) 是错误的。 printf("%s", p) 打印整个字符串,printf("%c", *p) 打印第一个字符。
  • 这确实是一个复杂的细节,你需要把它做好。在你走得更远之前,你需要学习一些教科书。但是声明中的anything * 表示“指向anything 实体的指针”。所以char * 表示“指向单个字符的指针”。 按照惯例,由于 C 没有“字符串”类型,char * 的含义被重载为有时也意味着“指向相关字符序列中的第一个字符的指针,可能以零字节”。但这只是一个约定,它不是语言的一部分。
  • "char means to read ..." - 嗯?那是不对的。你的解释或理解都离你几步之遥。 char 除了成为 char 之外没有其他意义。而char* 只不过是char 的内存地址。没有"destination",除了“字符串”末尾的空终止符,但char对此一无所知。但是printf 会循环并找到%s 的空终止符。
  • 好吧,我并不真正关心我写的语法错误,我只是在专注于我的观点时盲目地打字并犯了一个错误。我知道 printf 指的是地址类型。好吧,无论如何这也不是我的意思,仍然感谢您的回答,关于第二个问题,我不确定您是否 100% 正确。因为根据声明,假设指针具有数据类型 int* a,b;它分别声明 int *a & int b 我认为编译器不会将指针视为数据类型

标签: c


【解决方案1】:

所以你的字符串“hello world”占用了一些内存。

[h][e][l][l][o][ ][w][o][r][l][d][\0]
[0][1][2][3][4][5][6][7][8][9][A][B ]

指针p 实际上只指向第一个字节。在这种情况下,字节 0。但是如果你在

的上下文中使用它

printf("%s", p)

然后printf 知道打印直到它得到空字符\0,这就是为什么它会打印整个字符串而不仅仅是'h'。

至于第二个问题,指针确实具有数据类型。如果您要大声说出来,则名称可能类似于在p 的情况下键入“指向字符的指针”,或在int *i 的情况下键入“指向整数的指针”。

【讨论】:

  • 谢谢!!我不知道 %s 表示“直到找到 '\0'”
【解决方案2】:

指针变量不保存数据类型,它们保存地址。但是您使用了一种数据类型,因此当您使用该指针从内存中读取数据时,您知道每一步将前进多少字节。

当您调用printf 时,表达式中的%s 告诉函数从 *p 指示的地址开始读取(如您所说,它确实保存了 'h' 的字节值),并且 到达终止字符时停止阅读。这是一个没有视觉表示的字符(您在代码中将其称为\0)。它告诉程序一个字符串在哪里结束。

【讨论】:

    【解决方案3】:

    这里 *p 是指向内存中某个位置的指针,它假定为 1 个字节(或字符)。所以它指向'h'字母。所以p[0] or *(p+0)会给你p。但是,您的字符串以不可见的 \0 字符结尾,因此当您使用 printf 函数时,它会输出所有符号,从 *p 指向的那个符号开始,直到 `\0'。

    而指针只是一个变量,它能够保存一些地址(4、8 或更多字节)。

    【讨论】:

      【解决方案4】:

      提问:

      我还在 Rithcie 的书中了解到,指针变量不具有数据类型。这是真的吗???

      简单地说,是的。

      C 中的数据类型用于在变量使用之前对其进行定义。变量的定义将为变量分配存储空间并定义将保存在该位置的数据类型。

      C 具有以下基本的内置数据类型。int,float,double,char

      引用C Data types

      Pointer是派生数据类型,每个数据类型都可以有一个与之关联的指针。指针没有关键字,但在变量和函数声明/定义中由前面的* 标记。大多数编译器都提供预定义的常量 NULL,相当于 0。

      【讨论】:

        【解决方案5】:

        如果 p 指向字符串,它不应该只读取 'h' 吗? 因为它只读取一个字符的大小?为什么 printf("%s", *p) 打印 整个字符串???

        将您的 printf("%s", *p) 更改为 printf("%c", *p) 您会看到您想要的。两者都根据格式说明符以不同的方式调用 printf,即 string(%s) 或 char(%c)。

        打印字符串使用printf("%s", p);

        打印字符使用printf("%c", *p);


        第二个答案。 : 指针拥有一种数据类型。这就是您使用 char *p 的原因。

        【讨论】:

          猜你喜欢
          • 2020-09-03
          • 2021-09-10
          • 2018-04-05
          • 2013-10-05
          • 1970-01-01
          • 2012-10-04
          • 2021-11-26
          • 2021-01-26
          • 1970-01-01
          相关资源
          最近更新 更多