使用C中的指针通过引用模拟传递

时间:2014-12-18 07:00:24

标签: c

此C程序假设从用户获取五个整数值并将它们存储在一个数组中。其次,它将要求用户提供另一个整数n。该值将用作数组元素的乘数。接下来,它将修改数组的元素,使新值是原始值的n倍,其中n是乘数。我将使用函数传递第一个数组元素的地址,并使用n,来修改值。

现在这是我提出的代码,但它只修改了数组的第一个元素。

#include <stdio.h>
#define SIZE 5

void multiply(int *aPtr, int);

int main(){
    int array[SIZE];
    int i=0;
    int m;

    printf("Enter 5 integers: ");
    for(i=0; i<SIZE; i++){
        scanf("%d", &array[i]);
        }

    printf("Please enter the multiplier: ");
    scanf("%d", &m);

    multiply(&array[0], m);

    for(i=0; i<SIZE; i++){
        printf("%d  ", array[i]);
        }

    return 0;
    }

void multiply(int *aPtr, int mul){

    for(i=0; i<SIZE; i++)
    *aPtr = *(aPtr+i) * mul;

    }

4 个答案:

答案 0 :(得分:1)

乘法后,您将所有值存储到同一位置,即*ptr。改变

*aPtr = *(aPtr+i) * mul;  

*(aPtr+i) = *(aPtr+i) * mul;

答案 1 :(得分:1)

修改

*aPtr = *(aPtr+i) * mul;  

*(aPtr+i) = *(aPtr+i) * mul;

另请注意,在C中没有传递参考。参数按值复制。你可以模拟但它不是模拟

答案 2 :(得分:0)

您必须增加数组位置。让你的代码像这样。在调用时你必须传递数组地址。 multiply(array, m);

for(i=0; i<SIZE; i++,aPtr++)
*aPtr = *aPtr * mul; 

或者。

for(i=0; i<SIZE; i++)
*(aPtr+i) = *(aPtr+i) * mul;   

因为* aPtr指向数组的第一个位置。在第一次乘法后,我们必须移动到第二位置。所以增量需要。对不起,第一个答案。

答案 3 :(得分:0)

您必须将每个位置的值相乘并再次将其存储在相同的位置 在您的代码中,只会存储乘以的最后一个值,因为*aPtr将指向第一个位置。
试试这段代码......

#include <stdio.h>
#define SIZE 5

void multiply(int *aPtr, int);

int main(){
    int array[SIZE];
    int i=0;
    int m;

    printf("Enter 5 integers: ");
    for(i=0; i<SIZE; i++){
            scanf("%d", &array[i]);
    }

    printf("Please enter the multiplier: ");
    scanf("%d", &m);

    multiply(&array[0], m);

    for(i=0; i<SIZE; i++){
            printf("%d  ", array[i]);
    }

    return 0;
}

void multiply(int *aPtr, int mul){
   int i = 0;
    for(i=0; i<SIZE; i++)
            *(aPtr + i) = *(aPtr+i) * mul;

}