我已经阅读了Stack Overflow上的几个类似问题,但在这种情况下,我找不到能够帮助我理解此警告的问题。我在尝试学习C的第一周就是这样,如果我因为缺乏理解而在Stack Overflow的其他地方错过了一个明显的答案,那么道歉。
我收到以下警告并注意:
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;
}
答案 0 :(得分:6)
Vowels
是char*
,*Vowels
只是char
,&#39; a&#39;。 char
被自动提升为整数,编译器允许将其隐式转换为指针。但是指针值不是Vowels
,它的地址将等于字符&#39;,0x61的整数编码几乎普遍。
只需将Vowels
传递给您的函数。
答案 1 :(得分:0)
在您的情况下,类型转换是从char
到integer
指针。在某些情况下,该函数将void指针作为第二个参数来容纳所有数据类型。
在这种情况下,您需要将第二个参数转换为(void *)
这将是大多数编写良好的模块化函数中的函数声明:
int CheckIfIn(char ch, void *checkstring);
如果元音不是字符指针,则需要将参数作为空指针传递
if(CheckIfIn(letter, (void *)Vowels) ){
printf("this is a vowel.\n");
}