数组引用

时间:2017-03-26 23:17:15

标签: c

我有一个通过引用函数传递设置大小为64的数组。我收到了警告

  

警告C4047:'功能' :' int *'间接水平与' int(*)[64]'

不同
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdint.h>

void hex_to_binary(char* hex, int* arr)
{
    int decimal = strtol(hex,NULL,16);
    int remainder=0;
    int pos = 63; 
    while(decimal!=0)
    {
        remainder=decimal%2;
        decimal/=2;
        arr[pos]=remainder;
        pos--;
    }
}
void print_64bin(int* bin)
{
    int pos;
    for(pos=0; pos<64;++pos)
    {
        printf("%d",bin[pos]);
    }
}
int main()
{
    int bin[64]={0};
    int q;
    char hex[20];
    printf("Enter hex\n");
    scanf("%s",&hex);
    hex_to_binary(&hex,&bin);
    printf("Answer\n");
    print_64bin(&bin);
}

任何人都可以解释为什么我这样做或提供解决方案?

3 个答案:

答案 0 :(得分:2)

int[64] a;不是有效的C声明。看起来您的编译器正在为您提取一些扩展技巧。你需要:

int a[64];

答案 1 :(得分:1)

间接是指通过指针访问变量。就像指针可以引用或指向变量(一个间接层)一样,指针也可以指向另一个指针,而指针又指向一个变量(两个间接层)。因为具有不同间接级别的两个指针可能引用两个不同的东西(一个可以指向一个变量,而另一个指向另一个指针),只要在表达式中包含这样的指针,编译器就会发出警告C4047。 / p>

例如,以下代码生成此警告但编译时没有更改:

void main() {
    char **p;// two levels of indirection
    char *q; // one level of indirection
    p = q;   // warning C4047
}

参考 - c4047 warning 1

c4047 warning 2

答案 2 :(得分:1)

您没有正确调用这些功能。

您现在正在调用它们的方式,您传递了数组的地址,但您的函数需要指向int的指针。

将数组传递给函数,而不使用address-of运算符&。数组将衰减为指向第一个元素的指针。

hex_to_binary(hex,bin);
...
print_64bin(bin);