C中的指针问题

时间:2009-04-23 22:08:52

标签: c pointers

问候, 我试图学习C中的指针,我只是想让我的“addtwo”函数为输入整数数组的每个元素添加2,但我得到奇怪的编译错误,这里是非指针版本,确实无法正确编译

addtwo(int *arr[]) {
    int i=0;
    for(;i< sizeof(arr)/sizeof(int);i++) {
        arr[i] = arr[i] + 2;
    }
}

main() {
    int myarray[] = {1,2,3,4};
    addtwo(myarray);
}

此致

7 个答案:

答案 0 :(得分:7)

你有一些问题。首先,您尝试将int*传递给类型为int**的参数。那不行。给它输入int*

void addtwo(int *arr){
    int i=0;
    for(;i< sizeof(arr)/sizeof(int);i++){
        arr[i] = arr[i] + 2;
    }
}

然后,您需要在另一个参数中传递大小。问题是,当你传递数组时,你真的只传递一个指针(编译器将组成一个指向数组第一个元素的临时指针)。所以你需要自己跟踪尺寸:

void addtwo(int *arr, int size){
    int i=0;
    for(;i<size;i++){
        arr[i] = arr[i] + 2;
    }
}


int main(void) {
    int myarray[] = {1,2,3,4};
    addtwo(myarray, sizeof myarray / sizeof myarray[0]);
}

现在它会起作用。同时将返回类型放在它们之前。有些编译器可能会拒绝您的代码,因为它不再符合最新的C标准,并且长期以来一直被弃用(省略返回类型是您使用旧K&amp; R C编码的方式)。

答案 1 :(得分:3)

addtwo(int *arr[])应为addtwo(int *arr)

您不能使用sizeof从指针获取数组的大小。通常,您可以将数组的大小作为单独的arg传递,也可以使用一些特殊值来标记最后一个元素。

答案 2 :(得分:3)

与编译错误无关,但是......

您必须将sizeof(arr)传递给函数,而不是在函数中调用它。当一个数组传递给一个函数时,C不再将它看作一个数组,而是作为一个指向内存的指针,所以当你现在调用它时,sizeof(arr)将返回指针arr的大小,这是最有可能4。

这就是我在代码中的意思:

void addtwo(int *arr, int size){
    int i=0;
    for(;i< size;i++){
        arr[i] = arr[i] + 2;
    }
}

int main(){
    int myarray[] = {1,2,3,4};
    addtwo(myarray, sizeof(arr)/sizeof(int));
    return 0; 
}

答案 3 :(得分:1)

在C中,符号int * arr []与int ** arr相同。

答案 4 :(得分:0)

您需要将指针传递给数组的第一个元素和数组大小。数组类型在函数参数的上下文中衰减为指针。尝试:

void addtwo(int *arr, size_t size){
    for(size_t i = 0; i < size; i++){
        arr[i] = arr[i] + 2;
    }
}


int main() {
    int v[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    addtwo(v, sizeof v / sizeof v[ 0 ]);
    return 0;
}

答案 5 :(得分:0)

虽然其他人已经给出了正确的答案,但是当你有

时,基本上你有一个指针数组
int *arr[]

我怀疑这是你想要的。如果你有

int arr[]

然后那也等同于

int *arr

答案 6 :(得分:0)

addtwo参数声明确实如下:

arr是一个指向整数

的指针数组

当你可能真的想要

指向整数数组的指针

How to Read C Declarations”一段时间以前真的帮助我解决了这个话题,也许它会为你做同样的事情。