char指针的整数警告

时间:2018-02-08 00:13:01

标签: c string pointers char

有人可以帮助我理解为什么我会得到"警告:从不同大小的整数转换为指针"对于以下两行代码?

所以我有一个指向字符串(char *string)和一个双指针(char **final)的指针,需要存储字符串中最后一个字符的地址...我想以下几行代码可以工作,但我一直收到错误...我该如何解决?

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

3 个答案:

答案 0 :(得分:2)

(char *)last

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

答案 1 :(得分:1)

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

*final = string;

答案 2 :(得分:0)

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

char last;

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

char *last;

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

现在你的问题。我们假设您创建一个这样的字符串:

char *str = "example";

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

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

(其中' \ 0'是标记字符串结尾的NULL字符。这对于处理字符串以识别字符串结束位置的任何函数都是必需的。)你创建的char指针名为" str"在第一个字符处指出,即' e。请记住,指针具有此char的地址,其余所有字符都存储在第一个char之后的地址空间中。

要访问此字符串中的特定字符,您必须取消引用指针" str"。如果您想要字符串中的第一个字符,请执行以下操作:

char first = *char;

这会将第一个char保存在char类型的变量中,名为" first",在这种情况下就是字母' e'。要获得第二个字符,请执行以下操作:

char second = *(char+1);

你实际做的是"阅读" (取消引用)您的char指针" str"指向+ 1步的大小" char"在记忆中。在这个例子中,这意味着char类型的变量称为" second"现在包含(ASCII值代表)字符串中的第二个字母,即' x'。

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

int length = strlen(str);

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

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

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

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

如果你想要一个指针,指向字符串的最后一个字符,你必须初始化一个新的字符指针,并指向放置(内存地址)的最后一个字符串" str"位于。通过与之前相同的逻辑,这是由" index"处的char的内存地址给出的。 6我们原来的字符串" str"。因此,您创建一个新指针,并让该指针指向此内存地址,如下所示:

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

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

#include <string.h>