указатель в c и c программе - PullRequest
2 голосов
/ 08 апреля 2010

Я изучаю указатели, и я столкнулся с этой программой:

#include <stdio.h>

void swap(int *,int *);

int main()
{
    int a=10;
    int b=20;
    swap(&a,&b);
    printf("the value is %d and %d",a,b);
    return 0;
}

void swap(int *a,int*b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
    printf("%d and%d\n",*a,*b);
}

Может ли кто-нибудь сказать мне, почему эта основная функция возвращает обратное значение? До сих пор я понимал, что вызов функции в C не влияет на основную функцию и ее значения.

Я также хочу знать, сколько места заняла переменная-указатель, например целое, заняли 2 байта, а также использование различных приложений и преимущества указателя ...

Ответы [ 3 ]

5 голосов
/ 08 апреля 2010

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

Удачи с указателями, кстати. Это самая трудная вещь в C, если вы пришли из контекста, в котором их нет. Я пришел к Си через Perl и несколько раз ломал голову над указателями. Но это откроет целый новый мир, как только вы их поймете.

2 голосов
/ 08 апреля 2010

Вы передаете адреса a и b функции подкачки, которая имеет два указателя, теперь указывающих на a и b. Значение a хранится в int t. значение b сохраняется затем в a, а значение, которое было сохранено в a (теперь в t), устанавливается на b.

Как только функция завершает работу, значения меняются местами, поэтому происходит изменение в main.

Если вы передадите действительные значения a и b вместо обмена, то адреса, которые вы не заметите, вернутся в main. Это сила указателей и установка адреса переменной на указатель.

Указатель теперь может изменять значение переменной, поскольку он имеет свой адрес. Думайте об этом, как о том, чтобы дать ключ от дома своему соседу. Теперь ваш сосед может войти в ваш дом и изменить расположение чего-либо в вашем доме, поскольку у него есть ключ (адрес переменной). Без ключа сосед не может попасть в ваш дом (пример передачи по значению), а без ключа не может устроить дом.

Нарисуйте картинки, которые они обычно помогают. Вот потрясающее объяснение, данное на stackoverflow:

Каковы барьеры для понимания указателей и что можно сделать, чтобы их преодолеть?

Пример, приведенный в ссылке, не относится непосредственно к C / C ++, но может применяться к любому языку, который может поддерживать изменение значений с помощью указателей / адресов.

1 голос
/ 08 апреля 2010

Функция получает копию того, что было передано (то есть «передача по значению»), поэтому она не может повлиять на оригинал того, что было передано. В этом случае передается указатель. Функция не меняет указатель (который был передан) в main, но она меняет то, на что ссылался этот указатель.

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