Передача переменных в функцию: область и когда использовать & и *? - PullRequest
1 голос
/ 16 декабря 2011
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"

void test (int a,int *b, int result[], int serie[]);

int main()
{
    int *serie = malloc(sizeof(int));
    int result[20], a,b, i;
    a=0;
    b=0;

    for (i = 0; i < 20; i++) {
        result[i]=i+10;
        serie[i]=rand();
        printf("result is %d \n",result[i]);
    }

    test(a,&b,result,serie);
    printf("value of a inside main %d \n",a);
    printf("value of b inside main %d \n",b);

    for (i = 0; i < 20; i++) {
        printf("value of result inside main is %d and of serie is %d        \n",result[i],serie[i]);
    }

    getchar();
    return 0;
}

void test(int a, int *b, int result[], int serie[]) {
    int i;
    a=13;
    *b=14;
    printf("value of a inside the function %d \n",a);
    printf("value of b inside the function %d \n",*b);
    for (i = 0; i < 20; i++) {
        result[i]=result[i]*2;
        serie[i]=7;
        printf("value of result inside the function is %d and of serie is %d\n",result[i],serie[i]);
    }
}

По сути, весь этот код видит область действия переменных, я написал это, чтобы помочь себе. Я подумал, как изменить значение целого числа внутри main с помощью функции (см. int b). Вы должны вызвать это с &b (test(a,&b,result,serie);) и затем внутри функции *b. Так что я пробовал подобные операции & * с массивами, но они не работали.

Кажется, все, что вам нужно сделать, это написать массив void test(... int result[],int serie[]) и для вызова функции просто поставить имя без скобок: test(...,result,serie); Я прав?

Что, если я хочу изменить только массивы внутри функции, как с переменной a?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Причина, по которой вы передаете без скобок, состоит в том, что имя массива по умолчанию соответствует адресу его первой записи:


  test(a, &b, result, serie);  
// is the same as  
  test(a,&b, &result[0], &serie[0]);  

Чтобы сохранить исходный массив без его изменения, вы должны передать копию массива вместо его адреса. Самый простой способ сделать это - обернуть массив в структуру и передать эту структуру по значению. Он скопирует весь массив в локальную функцию и позволит вам делать с ней все, что угодно, не затрагивая оригинал. В C. нет способа передать массив по значению (которое я знаю). При ссылках просто возвращается первая запись массива - еще одна особенность языка C.

1 голос
/ 16 декабря 2011

Да, это правильно.Чтобы изменить массивы, все, что вам нужно сделать, это объявить его следующим образом:

void test(... int result[], int serie[]);

или вот так:

void test(... int *result, int *serie);

Оба вышеприведенных значения эквивалентны.

Почемуэто правда, что вы передаете указатель, который получает переданное значением .Это отличается от самого массива, который передается по ссылке (через указатель).Таким образом, указатель копируется, и если вы попытаетесь изменить значение результата без использования *, оно не будет длиться вне функции.Если вы хотите изменить массивы внутри функции без изменения оригиналов, вы должны скопировать их либо до передачи, либо после.

1 голос
/ 16 декабря 2011

Массивы всегда передаются по ссылке в C, поэтому передача адреса массива целых чисел в функцию (например, &result в main) подобна передаче двойного указателя (int**).Ошибка, которую вы получили, когда пытались это сделать, была ошибкой ввода.

Что, если я хочу изменить только массивы внутри функции, как с переменной a?Я не уверен, что вы подразумеваете под этим вопросом.Не могли бы вы уточнить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...