2013-02-23 84 views
1

我有一个关于理解指针和函数如何工作的问题。 我想看看函数如何看起来像qsort(),但我需要使用我自己的函数来交换元素和比较元素。我很惊讶地知道,我的功能不交换数据...C/C++,指针和函数的问题

我的代码:

//prototypes file: other.h 

void Sort(char* pcFirst, int nNumber, int size, void (*Swap)(void*, void*), int (*Compare)(void*, void*)); //sorts any arrays 
void SwapInt(void* p1, void* p2); // swap pointers 
int CmpInt(void* p1, void* p2); // compare poineters 

//realisation file: other.cpp 

#include "other.h" 
void Sort(char* pcFirst, int nNumber, int size, 
    void (*Swap)(void*, void*), int (*Compare)(void*, void*)) 
{ 
    int i; 
    for(i = 1; i < nNumber; i++) 
     for(int j = nNumber - 1; j >= i; j--) 
     { 
      char* pCurrent = pcFirst + j * size; 
      char* pPrevious = pcFirst + (j - 1) * size; 
      if((*Compare)(pPrevious, pCurrent) > 0)// if > 0 then Swap 
      { 
       (*Swap)(pPrevious, pCurrent); 
      } 
     } 
} 

void SwapInt(void* p1, void* p2) 
{ 
    int * ptmp1 = static_cast<int*>(p1); 
    int * ptmp2 = static_cast<int*>(p2); 
    int * ptmp = ptmp1; 
    ptmp1 = ptmp2; 
    ptmp2 = ptmp; 
} 

int CmpInt(void* p1, void* p2) 
{ 
    int nResult; 
    int * ptmp1 = static_cast<int*>(p1); 
    int * ptmp2 = static_cast<int*>(p2); 
    nResult = (*ptmp1 - *ptmp2); 
    return nResult; 
} 

//main file: lab.cpp 
#include <tchar.h> 
#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include "other.h" 

int _tmain() 
{ 
int nAr[] = {33,44,55,22,11}; //array for sort 
    int nTotal = sizeof(nAr)/sizeof(int); //number of elements 
for (int i = 0; i < nTotal; i++) 
    { 
     printf("%d ",nAr[i]); // result of cycle is 33 44 55 22 11 
    } 
    Sort(reinterpret_cast<char*>(&nAr[0]), nTotal, sizeof(int), SwapInt, CmpInt); 
for (int i = 0; i < nTotal; i++) 
    { 
     printf("%d ",nAr[i]); // result of cycle is 33 44 55 22 11 too =(
    } 
} 

为什么数组没有改变?

在调试器中,我可以看到所有的指针都改变了,并得到正确的值,但在main我的数组没有改变。

+1

你的代码只交换指针,而不是它们指向的东西。 – 2013-02-23 17:11:28

回答

0

你可以看看不同组合,因为这些.....

#include<iostream> 
#include<stdio.h> 
#include<malloc.h> 
//Call by Address 
    void SwapIntAddr(int* ptmp1, int* ptmp2) 
    { 
     int ptmp; 
     ptmp = *ptmp1; 
     *ptmp1 = *ptmp2; 
     *ptmp2 = ptmp; 
    } 

//Call by Reference 

    void SwapIntRef(int& ptmp1, int& ptmp2) 
    { 
     int ptmp; 
     ptmp = ptmp1; 
     ptmp1 = ptmp2; 
     ptmp2 = ptmp; 
    } 
//Call by Reference but in pointer level 
    void SwapPtrRef(int*& ptmp1, int*& ptmp2) 
    { 
     int* ptmp; 
     ptmp = ptmp1; 
     ptmp1 = ptmp2; 
     ptmp2 = ptmp; 
    } 

//Call by Address but in Pointer level. 

    void SwapPtrAddr(int** ptmp1,int** ptmp2) 
    { 
     int** ptmp = (int**) malloc(sizeof(int*)); 
     *ptmp = *ptmp1; 
     *ptmp1 = *ptmp2; 
     *ptmp2 = *ptmp; 
    } 


int main(){ 
    int a = 3, b= 5; 
    int* p1 = &a; 
    int* p2 = &b; 

    SwapIntAddr(p1,p2); 
    printf("%d %d\n",*p1,*p2); 

    SwapIntRef(*p1,*p2); 
    printf("%d %d\n",*p1,*p2); 

    SwapPtrRef(p1,p2); 
    printf("%d %d\n",*p1,*p2); 

    SwapPtrAddr(&p1,&p2); 
    printf("%d %d\n",*p1,*p2); 

    return 0; 
} 
+0

你试过编译这个 – 2013-02-23 17:20:42

+0

把这个void放到一边并且不会编译,如果你看看函数的名字,应该很清楚,他的意图是交换整数,而不是指针本身。 – Slava 2013-02-23 17:22:32

+0

是的,我已经改变了代码,现在编译并运行。 – 2013-02-23 17:53:14

0

你的SwapInt函数交换了一些指针,而不是int s。由于所有这些指针都是SwapInt的本地指针,因此它没有实际效果。可能你打算用int*ptmp1*ptmp2做点什么。

3

指针指向的对象

代码

int * ptmp = ptmp1; 
ptmp1 = ptmp2; 
ptmp2 = ptmp; 

局部改变在函数指针的一些价值观,而这一切。

以交换两个对象的值,通过引用传递:

void swap_values_of(int& a, int& b) 
{ 
    int const original_a = a; 
    a = b; 
    b = original_a; 
} 

你也可以做到这一点,不太安全,具有指针参数,然后小心地交换价值指向,而不是指针本身。

但除了学习的目的,使用std::swap代替


没有要求,但是......如果你改变微软特有的电流

int _tmain() 

只是标准

int main() 

那么代码将(更有可能)在例如Linux操作系统。

只是一个提示

+0

非常感谢你! – sesega 2013-02-23 17:19:06

+0

解决了。我刚刚使用:\t int tmp = * ptmp1; \t * ptmp1 = * ptmp2; \t * ptmp2 = tmp; – sesega 2013-02-23 17:19:45

0

你实际上在做什么是交换指针。你要做的是交换值,指针指向哪里。至少来自你的程序逻辑。 所以,你的代码可能是这样的:

void SwapInt(void* p1, void* p2) 
{ 
    int * ptmp1 = static_cast<int*>(p1); 
    int * ptmp2 = static_cast<int*>(p2); 
    int ptmp = *ptmp1; 
    *ptmp1 = *ptmp2; 
    *ptmp2 = ptmp; 
} 
+0

谢谢=)使用它,它的工作原理! – sesega 2013-02-23 17:21:31