【问题标题】:C/C++, troubles with pointers and functionsC/C++,指针和函数的麻烦
【发布时间】:2013-02-09 04:36:15
【问题描述】:

我有一个关于指针和函数如何工作的小问题。 我想看看一个函数看起来像qsort(),但我需要使用我自己的函数来交换元素和比较元素。得知我的函数不交换数据,我感到非常惊讶......

我的代码:

//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 中,我的数组没有改变。

【问题讨论】:

  • 您的代码只是交换指针,而不是它们指向的内容。

标签: c++ function pointers function-pointers


【解决方案1】:

指针指向对象

代码

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


没有要求,但是...如果您更改当前的 Microsoft 特定

int _tmain()

只是标准

int main()

然后代码将(更有可能)在例如Linux。

只是一个提示

【讨论】:

  • 已解决。我刚刚用过:int tmp = *ptmp1; *ptmp1 = *ptmp2; *ptmp2 = tmp;
【解决方案2】:

你可以看看这些不同的组合.....

#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;
}

【讨论】:

  • 抛开那个 void & 不会编译,如果你看一下函数名应该很清楚,他的意图是交换整数,而不是指针本身。
  • 一切都很好!一点点幸福=)
  • 我应该编写什么函数来对字符串数组进行排序?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 2014-05-17
      • 2023-03-23
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多