C语言中的指针问题

C语言中的指针问题,c,pointers,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}; add

您好, 我正在尝试学习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);
}
addtwo(int*arr[]{
int i=0;
对于(;i
关于

addtwo(int*arr[])
应该是
addtwo(int*arr)


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

与编译错误无关,但是

您必须将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; 
}
void addtwo(int*arr,int size){
int i=0;
对于(;i
在C中,符号int*arr[]与int**arr相同。

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

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;
}
void addtwo(int*arr,size\u t size){
对于(大小i=0;i
您遇到了一些问题。首先,尝试将
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 i=0;
对于(;i
然后,需要在另一个参数中传递大小。问题是,当传递数组时,实际上只传递一个指针(编译器将组成一个指向数组第一个元素的临时指针)。因此,您需要自己记录尺寸:

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]);
}
void addtwo(int*arr,int size){
int i=0;

对于(;i虽然其他人已经给出了正确的响应,但基本上,当您有一个指针数组时

int *arr[]
我怀疑这是你想要的。如果你有

int arr[]
那么这也就相当于

int *arr

addtwo参数声明的内容如下:

arr是指向整数的指针数组

当你真的想要的时候

指向整数数组的指针


“”不久前,sizeof确实帮助我研究了这个主题,也许它也能为您提供同样的帮助。

sizeof在addtwo的正文中不起作用。因此,这不是一个完整的答案。+1最初是正确的。编辑后,main在函数签名行中缺少一个返回。但实际返回0;可以删除。或者,将数组作为int[4]传递而不是int*。你不能在C中这样做:(最好的匹配是传递一个指向数组的指针。然后它看起来像void addtwo(int(*arr)[4])…addtwo(&myarray)。但是你不能传递任何其他大小,而且看起来相当可怕:)看看这个答案的细节:哦,你是对的,尽管你说“不能”这样做并不完全正确——您仍然可以将参数声明为int[4],但它与int[]或int*。事实上:)我的意思是说您不能将其作为int[4]传递。当然,没有什么可以阻止您将参数声明为int[4]:)