2016-06-09 4 views
-12

У меня есть эта небольшая проблема. В настоящее время я пишу немного более крупный проект, чем это, но я хотел показать свою проблему в качестве основного lvl. Итак, у меня есть простой массив из 10 элементов, если целые числа, и указатель на четвертый элемент в этом массиве. Я заполняю массив цифрами 0 ... 9, а затем сортирую их в обратном порядке. Как вы видите, указатель все еще показывает мне значение на четвертом месте (это правильно). Так что мой вопрос. Есть ли вероятность, что указатель как-то «следует» тому значению, которое оно указывало на самое начало кода (значение = 3). Извините за плохой английский, если у нас есть вопросы, я попытаюсь объяснить. Вот код.C++ Необходимо решить эту проблему

#include<iostream> 
#include<Windows.h> 
using namespace std; 
void main() 
{ 
    int tab[10]; 
    int *ptr; 
    for (int i = 0; i < 10; i++) tab[i] = i; 
    ptr = &tab[3]; 
    for (int i = 0; i < 10; i++) cout << tab[i] << endl; 
    cout << *ptr << endl; 
    for (int i = 0; i < 10; i++) 
     for (int j = 0; j < 9; j++) 
      if (tab[j] < tab[j + 1) swap(tab[j], tab[j + 1]); 
    for (int i = 0; i < 10; i++) cout << tab[i] << endl; 
    cout << *ptr; 
    system("pause"); 
} 
+0

Каков реальный выход? Каков ожидаемый результат? –

+0

Я ожидаю, что после перетасовки чисел (значений) в массиве указатель все равно будет указывать на значение (NOT ADRESS), которое оно указывало перед перемещением. –

+7

«Нужно решить этот пост» - наименее описательное название, о котором я могу думать. Как вы думаете, другие задают вопросы здесь, потому что им нужно решение медленно? – user463035818

ответ

-2
#include<iostream> 
#include<Windows.h> 
using namespace std; 
void main() 
{ 
    int tab[10]; 
    int *ptr; 
    for (int i = 0; i < 10; i++) tab[i] = i; 
    int position=3; 
    ptr = &tab[position]; 
    for (int i = 0; i < 10; i++) cout << tab[i] << endl; 
    cout << *ptr << endl; 
    for (int i = 0; i < 10; i++) 
     for (int j = 0; j < 9; j++) 
      if (tab[j] < tab[j + 1]){ 
       swap(tab[j], tab[j + 1]); 
       if(j==position){ ptr=&tab[j+1]; position=j+1;} 
       if(j+1==position){ ptr=&tab[j]; position=j;} 
      } 
    for (int i = 0; i < 10; i++) cout << tab[i] << endl; 
    cout << *ptr; 
    system("pause"); 
} 
0

справа, во-первых ваш вопрос остается неясным. Правильно ли я думаю, что вы хотите сделать свой selection sort, но у вас указатель перемещается со значением, на которое он указывает? Во-вторых, я бы посоветовал обратиться к help center за информацией о том, что вы можете спросить здесь, и как его спросить.

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

Есть лучшие способы сделать это

std::array<int, 10> tab; 
for (int i = 0; i < tab.size(); ++i) {tab = i;}  // tab = [0,1,2,3,4,5,6,7,8,9] 
auto itr = tab.begin() + 3;       //*itr = 3 
auto val = *itr;         // Permanent copy of *itr 

// Solution 1: 
// Do a sort, then find your element again. 
// Only works if element is unique! 
std::sort(tab.rbegin(), tab.rend());    // tab = [9,8,7,6,5,4,3,2,1,0] 
itr = std::find(tab.begin(), tab.end(), val);  //*itr = 3 

// Solution 2: 
// Do your sort, then calculate where the element should be 
// Only works for arrays that are initially sorted, then sorted into reverse order 
auto pos = 3; 
std::sort(tab.rbegin(), tab.rend()); 
pos = tab.size() - pos - 1;       // -1 for one past the end problem 
itr = tab.begin() + pos; 

я использовал std::sort, а не выбор рода, потому что это не всегда хороший выбор рода. Я также использовал итераторы, потому что они менее опасны.

Если вы хотите, чтобы ваш указатель отслеживал элемент независимо от того, что вы делаете с ним, вы можете сделать tab массив указателей, указывающих на ваши элементы. Затем просто поменяйте указатели. Live Demo of all solutions here.

0

Если вы знаете длину массива (п), то и предполагается, что вы вводите переменную целого типа, указатель указывает на определенную позицию (л), а затем

int n,b[100],l=3; // b is array, l is the position to be pointed 
cin>>n;    //taking the length of array 
int *a=b[l],k = n-l; //pointing at new position 
*a=a[k*2];   //as the size of a integer file is 2 bytes 
Смежные вопросы