warning C4047: 'function' : 'int *' differs in levels of indirection from 'int '
时间: 2023-12-22 20:04:04 浏览: 701
这是一个编译器警告,意思是你在一个函数中使用了一个参数,但是该参数的类型与函数定义中声明的类型不匹配。具体来说,可能是你在函数中使用了一个指针类型的参数,但是你在函数定义中将该参数声明为了一个非指针类型的变量。
例如,以下代码会产生这个警告:
```
void foo(int* ptr) {
// do something
}
int main() {
int num = 10;
foo(num); // warning C4047: 'function' : 'int *' differs in levels of indirection from 'int '
return 0;
}
```
要解决这个问题,你需要在函数定义和函数声明中保持参数类型的一致性。在上面的例子中,可以将 `foo` 函数的声明改为 `void foo(int num)` 或将 `foo` 函数的调用改为 `foo(&num)`。
相关问题
'=' : 'int *' differs in levels of indirection from 'int ** '
这个错误通常是因为你在将一个 `int **` 类型的指针赋值给一个 `int *` 类型的指针时出现的。这两个指针类型之间的间接级别不同,因此不能直接进行赋值操作。
例如,以下代码会导致这个错误:
```
int **p1;
int *p2;
int a = 10;
p1 = &p2; // 这里会出现上述错误
*p1 = &a;
**p1 = 20;
```
这里,我们尝试将 `p2` 的地址赋给 `p1`,但是 `p1` 是一个指向指针的指针,而 `p2` 是一个指向整数的指针,因此它们的间接级别不同。
要解决这个问题,你需要使用适当的类型转换来将 `int **` 类型的指针转换为 `int *` 类型的指针。例如,你可以使用以下代码来修复上面的示例:
```
p1 = (int **)&p2; // 使用类型转换来将 p2 的地址赋给 p1
*p1 = &a;
**p1 = 20;
```
请注意,这里使用了 `(int **)&` 类型转换来将 `int *` 类型的指针 `p2` 的地址转换为 `int **` 类型的指针。这样就可以将 `p2` 的地址赋给 `p1`,并且代码可以正常工作。
函数声明:void DES(int *str,int key); 主函数中调用函数:DES(str,key); 已知主函数中str和key都是为大小为64的int数组 报错:'function' : 'int ' differs in levels of indirection from 'int [64]' 可能是什么原因?
这个错误提示表明你在函数调用时传递的参数类型与函数声明中的参数类型不匹配。
根据你提供的信息,str 和 key 都是大小为 64 的 int 数组,而函数声明中的 str 参数是一个指向 int 类型的指针,而不是一个 int 数组。因此,在函数调用时,你需要将数组名转换为指针类型,然后将该指针传递给函数。
正确的函数调用应该是这样的:
```
DES(&str[0], key);
```
其中 &str[0] 表示 str 数组的第一个元素的地址,它是一个指向 int 类型的指针,可以作为函数的第一个参数传递。key 是一个 int 类型的值,表示 DES 加密算法的密钥。
如果你需要在函数内部访问整个 str 数组,可以在函数内部使用指针运算符来访问它。例如,可以使用 *(str+i) 来访问数组的第 i 个元素。
阅读全文