Свопинг адресов указателей в C++

Все функции являются на самом деле экземплярами встроенного Функция тип, который имеет конструктора, который берет строку, содержащую функциональное определение, таким образом, можно на самом деле определить функции во времени выполнения, например, связав строки:

//e.g., createAddFunction("a","b") returns function(a,b) { return a+b; }
function createAddFunction(paramName1, paramName2)
 { return new Function( paramName1, paramName2
                       ,"return "+ paramName1 +" + "+ paramName2 +";");
 }

кроме того, для пользовательских функций, Function.toString () возвраты функциональное определение как литеральная строка.

5
задан Peter Mortensen 1 December 2009 в 13:50
поделиться

5 ответов

Если вы хотите поменять местами адреса, на которые указывают указатели, а не только значения, хранящиеся по этому адресу, вам нужно будет передать указатели по ссылке (или указатель на указатель).

#include <cassert>
void swap(int*& a, int*& b)
{
    int* c = a;
    a = b;
    b = c;
}

int main()
{
    int a, b;
    int* pa = &a;
    int* pb = &b;

    swap(pa, pb);

    assert(pa == &b);  //pa now stores the address of b
    assert(pb == &a);  //pb now stores the address of a
}

Или вы можете использовать функцию подкачки STL и передать ей указатели.

#include <algorithm>

std::swap(pa, pb);

Однако ваш вопрос не кажется очень ясным.

17
ответ дан 18 December 2019 в 05:19
поделиться

В C ++ вы должны написать

 void swap(int *a, int *b)
 {
    std::swap(*a, *b);
 }

или, скорее, просто использовать:

 std::swap(a, b);
9
ответ дан 18 December 2019 в 05:19
поделиться

Новый ответ (поскольку вопрос был переформулирован)

заключается в том, что адреса переменных определяются во время компиляции и, следовательно, не могут быть заменены. Однако указатели на переменные можно менять местами.

Старый ответ: это был ответ, когда вопрос все еще подразумевал замену значений двух переменных с помощью функции:

вызов функции:

 int width=10, height=20;
 swap(&width, &height)

реализация:

 void swap(int *a, int *b)
 {
      int temp;
      temp=*a;
      *a = *b;
      *b = temp;
 }

или ... без использования временной переменной:; ^)

 void swap(int *a, int *b)
 {
      *a ^= *b;
      *b ^= *a;
      *a ^= *b;
 }

обратите внимание, что последний метод не работает в случае: swap (& a, & a). Очень резко отмечено пользователем9876 в комментариях.

8
ответ дан 18 December 2019 в 05:19
поделиться

Кажется, вы немного запутались в терминах.

У объекта обычно есть адрес. Это место в памяти, где находится объект. У некоторых временных объектов нет адресов, потому что их не нужно хранить. Таким исключением является временный объект "4" в выражении (2 + 2) * 3

Указатель - это объект, который хранит адрес другого объекта. Следовательно, для каждого типа существует соответствующий указатель. int имеет int * , std :: string имеет std :: string * и т. Д.

Теперь вы пишете о «адреса указателей». Они существуют. В конце концов, я написал, что указатель - это объект, а значит, у него есть собственный адрес. И вы можете сохранить этот адрес в другом указателе. Например, вы можете сохранить адрес и int * в int * * . Но действительно ли вы это задумывали? Или вы имели в виду «адрес , на который ссылается указатель»?

Теперь вы приводите рост и вес в качестве примеров. Стандартный способ поменять их местами в C ++ - это просто std :: swap (width, height) . Обратите внимание на std :: , который является префиксом для функций стандартной библиотеки C ++. std :: swap заменит почти все. интс, поплавки, жены. (j / k).

Похоже, у вас есть еще одна функция подкачки. Он принимает два указателя на целые числа, что означает, что ему нужны адреса двух целых чисел. В этом случае их легко предоставить. width - целое число, а & width - его адрес. Это можно сохранить в аргументе указателя int * a . Точно так же вы можете сохранить адрес и высоту в аргументе int * b . Собрав все вместе, вы получите вызов swap (& width, & height);

Как это работает? Функция swap (int * a, int * b) имеет два указателя, хранящих в памяти адрес двух целых чисел. Итак, что он может сделать, так это [1] выделить копию первого целого числа, [2] скопировать второе целое число в память, где было первое целое число, и [3] скопировать первое целое число обратно в память, где второе целое число целое было. В коде:

 void swap(int *a, int *b)
 {
      int temp = *a; // 1
      *a = *b;       // 2
      *b = temp;     // 3
 }
6
ответ дан 18 December 2019 в 05:19
поделиться

Если вы хотите изменить адреса указателей, вы должны передать указатели этих указателей в качестве параметров:

void swap(int **a, int **b); //as prototype

Эти примеры просто изменяют значения указателей.

1
ответ дан 18 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: