C / C ++,指针和函数的麻烦 [英] C/C++, troubles with pointers and functions

查看:101
本文介绍了C / C ++,指针和函数的麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的代码:

<$ p $ (char * pcFirst,int nNumber,int size,void(* Swap)(void *,void *), int(* Compare)(void *,void *)); //排序任何数组
void SwapInt(void * p1,void * p2); //交换指针
int CmpInt(void * p1,void * p2); // compare poineters

//实现文件:other.cpp

#includeother.h
void排序(char * pcFirst,int nNumber,int大小,
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; $(b * b)if((* Compare)(pPrevious,pCurrent)> 0)// if>> 0然后交换
{
(* Swap)(pPrevious,pCurrent);




void SwapInt(void * p1,void * p2)
{
int * ptmp1 = static_cast< int * GT;(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);
返回nResult;
}

//主文件:lab.cpp
#include< tchar.h>
#include< iostream>
#include< cstdio>
#include< cmath>
#includeother.h

int _tmain()
{
int nAr [] = {33,44,55,22,11}; // array for sort
int nTotal = sizeof(nAr)/ sizeof(int); //元素数量
(int i = 0; i< nTotal; i ++)
{
printf(%d,nAr [i]); //结果周期为33 44 55 22 11

排序(reinterpret_cast< char *>(& nAr [0]),nTotal,sizeof(int),SwapInt,CmpInt);
for(int i = 0; i< nTotal; i ++)
{
printf(%d,nAr [i]); //循环的结果是33 44 55 22 11 too =(

}

为什么数组没有改变?



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

您可以看看这些不同的组合...... 。

  #include< iostream> 
#include< stdio.h>
#include< malloc。 h>
//由地址调用
void SwapIntAddr(int * ptmp1,int * ptmp2)
{
int ptmp;
ptmp = * ptmp1;
* ptmp1 = * ptmp2;
* ptmp2 = ptmp;
}

//调用引用

void SwapIntRef(int& ptmp1,int& amp; ; ptmp2)
{
int ptmp;
ptmp = ptmp1;
ptmp1 = ptmp2;
ptmp2 = ptmp;
}
//通过引用调用,但在指针级别
void SwapPtrRef(int *& p tmp1,int *& ptmp2)
{
int * ptmp;
ptmp = ptmp1;
ptmp1 = ptmp2;
ptmp2 = ptmp;
}

//按地址呼叫,但在指针级别。

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 \\\
,* p1,* p2);

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

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

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

返回0;
}


I have a little question about understand how pointers and functions work. I want to see how a function looks like qsort(), but I need to use my own function to swap elements and to compare elements. I am very surprised to know that my function does not swap data...

My code:

//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 =(
    }
}

Why does the array not change?

In the debugger I can see that all pointers change, and get correct values, but in main my array is not changed.

解决方案

You may look at various combinations as these.....

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

这篇关于C / C ++,指针和函数的麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆