传递参数使整数指针没有转换

问题描述:

我已经通过堆栈溢出几个类似的问题,但我一直没能找到一个可以帮助我理解这种情况下的警告。尽管如此,我还是在尝试学习C的第一周,所以如果由于缺乏理解而错过了堆栈溢出的其他明显答案,我很抱歉。传递参数使整数指针没有转换

我得到以下警告和注意事项:

warning: passing argument 2 of ‘CheckIfIn’ makes pointer from integer without a cast [enabled by default] 
if(CheckIfIn(letter, *Vowels)){ 
^ 

note: expected ‘char *’ but argument is of type ‘char’ 
int CheckIfIn(char ch, char *checkstring) { 

当试图编译这段代码:

#include <stdio.h> 
#include <string.h> 
#define CharSize 1 // in case running on other systems 

int CheckIfIn(char ch, char *checkstring) { 
    int string_len = sizeof(*checkstring)/CharSize; 
    int a = 0; 

    for(a = 0; a < string_len && checkstring[a] != '\0'; a++){ 

     if (ch == checkstring[a]) { 
      return 1; 
     } 
    } 
    return 0; 
} 


// test function  
int main(int argc, char *argv[]){ 
    char letter = 'a'; 
    char *Vowels = "aeiou";  

    if(CheckIfIn(letter, *Vowels)){ 
     printf("this is a vowel.\n"); 
    } 

    return 0; 
} 
+6

修复类型:'CheckIfIn(letter,* Vowels)'应该是'CheckIfIn(letter,Vowels)'。然后'sizeof(* checkstring)/ CharSize'不是你所期望的。 – Jarod42 2014-08-30 16:50:57

+2

'#define CharSize 1 //在其他系统上运行时''''char'的大小始终为1,即使在非8位系统上也是如此。因此,在所有系统上,int string_len = sizeof(* checkstring)/ CharSize;总是计算为1。你需要将一个数组的长度作为一个单独的参数传递给一个函数,或者如果你的数组有一些sentinel值(比如字符串的0字节),可以使用'strlen'这样的函数:'size_t string_len = strlen(checkstring );'。 – mafso 2014-08-30 17:12:22

+2

另外。由于你不想修改元音指向的字符串,所以你应该将它声明为一个'const char *'(一个指向'const'字符串的指针),并将'CheckIfIn'的参数类型从char *到'const char *'。 – John 2014-08-30 18:18:43

Vowelschar**Vowels只是一个char, 'A'。 char会自动提升为整数,您的编译器允许将其隐式转换为指针。但是指针值不会是Vowels,它将是等于字符'a'的整数编码的地址,几乎通用为0x61。

只需通过Vowels到您的功能。

+0

谢谢 - 非常清楚的解释 – DanBennett 2014-08-30 19:07:46