2016-06-09 13 views
-12

So habe ich dieses kleine Problem. Ich schreibe gerade ein etwas größeres Projekt als das, aber ich wollte mein Problem so grundlegend wie möglich darstellen. So .. Ich habe eine einfache 10-Elemente-Array, wenn ganze Zahlen und ein Zeiger auf das vierte Element in diesem Array. Ich fülle das Array mit den Zahlen 0 ... 9 und sortiere sie dann in umgekehrter Reihenfolge. Wie Sie sehen können, zeigt der Zeiger immer noch den Wert auf dem vierten Platz (das ist richtig). Also meine Frage ist. Gibt es eine Möglichkeit, dass der Zeiger irgendwie dem Wert folgt, auf den er gerade am Anfang des Codes zeigte (Wert = 3). Sorry für schlecht Englisch, wenn Sie irgendwelche Fragen haben, werde ich versuchen, zu erklären. Hier ist ein Code.C++ Müssen diese schnelle Lösung

#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

Was ist die tatsächliche Ausgabe? Was ist die erwartete Ausgabe? –

+0

Ich erwarte, dass nach dem Mischen der Zahlen (Werte) im Array der Zeiger immer noch auf den Wert (NOT ADRESS) zeigt, den er vor dem Mischen gezeigt hat. –

+7

"Das muss schnell gelöst werden" ist der am wenigsten beschreibende Titel, den ich mir vorstellen kann. Denkst du, dass andere hier Fragen stellen, weil sie eine langsame Lösung brauchen? – user463035818

Antwort

-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

Recht, ist zunächst einmal Ihre Frage unklar. Habe ich recht, wenn ich denke, dass Sie Ihre selection sort machen wollen, aber haben Sie den Zeiger mit dem Wert bewegt, auf den er zeigt? Zweitens würde ich beraten die help center für Informationen darüber, was Sie hier fragen können, und wie man es gut fragen.

Um naiv zu tun, was Sie wollen, müssten Sie prüfen, ob der Wert, den Sie ausgetauscht haben, der gleiche wie der Wert im Zeiger war (vorausgesetzt, dieser Wert ist einzigartig), und dann den Zeiger tauschen, wenn es ist. Um das einzigartige Problem zu umgehen, könnten Sie Adressen vergleichen und tauschen, wenn die Adresse die gleiche ist. Beide erfordern viele zusätzliche Überprüfungen, also würde ich dies nach Möglichkeit vermeiden.

Es gibt bessere Möglichkeiten, diesen

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; 

ich verwendet habe, zu tun std::sort eher als eine Auswahl Art, denn es ist nicht immer eine gute Wahl von Art ist. Ich habe auch Iteratoren verwendet, weil sie weniger gefährlich sind.

Wenn Sie möchten, dass Ihr Zeiger das Element verfolgt, egal was Sie damit machen, dann können Sie tab ein Array von Zeigern machen, die auf Ihre Elemente zeigen. Dann tausche einfach die Zeiger um. Live Demo of all solutions here.

0

Wenn man weiß, die Länge der Anordnung (N) und unter der Annahme, dann Sie eine ganzzahlige Variable vom Typ eingeben, Zeiger zeigen an einer bestimmten Position (L) dann

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 
Verwandte Themen