【问题标题】:Integer warning for char pointerchar 指针的整数警告
【发布时间】:2018-02-08 00:13:00
【问题描述】:

谁能帮我理解为什么我会在以下两行代码中收到“警告:从不同大小的整数转换为指针”?

所以我有一个指向字符串 (char *string) 的指针和一个双指针 (char **final) 需要存储字符串中最后一个字符的地址...我认为以下代码行会起作用但我不断收到错误...我该如何解决?

char last = *string; 
*final = (char *)last;

【问题讨论】:

  • 你认为这些行单独做什么?两者都不适合做你想做的事,但我不知道如何在不知道你认为他们做什么的情况下解释为什么不这样做。
  • lastchar(整数),*final 是指向 char 的指针。您正在将整数转换为指针。警告说得很清楚。
  • 所以我在字符串的最后一个字符处(又名 string = 'c'),我试图让我的 char* 最终指针存储字符串中的字符“c”。这个逻辑有意义吗?
  • *final = string;

标签: c string pointers char


【解决方案1】:
(char *)last

last 的类型为 char。将其转换为指针意味着存储在last 中的字符的数字代码将被解释为地址。因此,如果last 包含A,那么这将导致值65 被解释为地址。 (假设 ASCII)。编译器很聪明,并表明这可能不是您想要的行为。

【讨论】:

  • 哦,我明白了...那我如何指向最后的地址?
【解决方案2】:

如果string 是指向字符串中最后一个字符的指针,则last 是该字符的副本。由于它只是该值的副本,因此它与原始字符串中的位置无关。要将指针保存到 final 指向的位置,您应该这样做:

*final = string;

【讨论】:

    【解决方案3】:

    要声明变量,您必须指定变量的类型,然后指定变量的名称。如果你想要一个“char”类型的变量,称为“last”,可以通过以下语法来实现:

    char last;
    

    如果你想要一个指向某个数据类型的变量的指针,你可以像这样添加星号:

    char *last;
    

    现在你有了一个指针,你可以用它来指向内存中必须包含一个字符的地方。如果您试图在 c 中创建一个“字符串”,那只不过是一系列字符,它们在内存中连续排序。您可以使用 char 指针指向这一系列 char 中的第一个 char,然后您可以通过将此 char 指针作为输入参数来使用适用于字符串的特定函数(例如 strcpy 或 strlen)。

    现在解决您的问题。假设您创建了一个这样的字符串:

    char *str = "example";
    

    你所做的是创建一系列字符,即

    'e', 'x', 'a', 'm', 'p', 'l', 'e', '\0'
    

    (其中 '\0' 是标记字符串结尾的 NULL 字符。这对于处理字符串的任何函数都必须识别字符串的结尾)。您创建的称为“str”的字符指针指向第一个字符,即“e”。记住,指针有这个 char 的地址,所有其余的 char 都存储在第一个 char 之后的地址空间中。

    要访问此字符串中的特定字符,您必须取消引用指针“str”。如果你想要字符串中的第一个字符,你可以这样做:

    char first = *char;
    

    这会将第一个字符保存在一个名为“first”的字符类型变量中,在本例中为字母“e”。要获得第二个字符,请执行以下操作:

    char second = *(char+1);
    

    您实际上正在做的是“读取”(取消引用)您的 char 指针“str”指向的值 + 1 步大小“char”在内存中。在本例中,这意味着名为“second”的 char 类型变量现在包含(表示)字符串中的第二个字母,即“x”。

    如果你想要一个字符串的大小,你可以使用函数 strlen。语法是这样的:

    int length = strlen(str);
    

    其中“str”是指向字符串中第一个字符(即“e”)的字符指针。 strlen 将返回字符串的长度,不包括仅标记字符串结尾的 NULL 字符 '\0'。这意味着在我们的示例中,长度将等于 7,因为“示例”一词中有 7 个字母。如果你想提取这个字符串的最后一个字母,现在你所要做的就是我们之前做的,但是记住在 C 中的索引从 0 开始。这意味着如果你有一个长度为 7 的字符串,最后一个元素此字符串将位于“索引”6。因此,要获取字符串的最后一个字符,您必须这样做:

    char last = *(str+length-1);
    

    或者如果您没有将长度保存到 int 类型的变量中,您可以这样做:

    char last = *(str+strlen(str)-1);
    

    如果你想要一个指针,指向字符串的最后一个字符,你必须初始化一个新的字符指针,让它指向“str”的最后一个字符所在的位置(内存地址)。按照与之前相同的逻辑,这是由原始字符串“str”的“index”6 处的 char 的内存地址给出的。所以你创建一个新的指针,并让这个指针指向这个内存地址,如下所示:

    char *last = str+strlen(str)-1;
    

    请记住,您需要在文件顶部包含头文件 string.h,如下所示:

    #include <string.h>
    

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2017-03-19
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多