2015-08-12 2 views
0
#include <stdio.h> 
void foo(int []); 

int main() 
{ 
    int ary[4] = {1, 2, 3, 4}; 
    foo(ary); 
    printf("%d ", ary[0]); 
} 

void foo(int p[4]) 
{ 
    int i = 10; 
    p = &i; 
    printf("%d ", p[0]); 
} 

Может кто-нибудь объяснить мне приведенный выше код. Я получаю вывод как 10 (в foo) и 1 (в основном). Но я ожидаю 10 и 10 (как в foo, так и в основном). Как и в функции, базовый адрес foo указывает на & i.Пропускание базового адреса массива

ответ

1

p эффективно локальный по отношению к foo (думать об этом как локальных переменной, которая получает инициализирована ж/данных от вызывающего абонента), поэтому изменения в нем не отражены в согласующем аргументе (в данном случае, ary). Теперь, если вы изменили содержимое массива (то есть то, что оба p и ary точка до), что отразилось бы на выходе.

1

Указатель p является локальным для функционирования foo. Поэтому изменение его значения не повлияет на массив функции main.

Если вы хотите изменить значение ary из функции foo попробовать это: (конечно, исключить p = &i)

p[0] = i; 

Это сделает ary[0] = 10

+0

одно сомнение: Как вы сказали, р локальна к функции, и как p [0] вносит изменения в arr. Также, что передается при отправке массива в качестве параметра, –

+0

Это просто, 'p' является локальным для' foo', но он по-прежнему указывает на 'ary', пока ему не будет присвоено иначе. После 'p = & i'' p' больше не указывает на 'ary'. Могу ли я это прояснить? –

+0

thks boss ... я понимаю ясно !!! –

Смежные вопросы