指针的高级引用,函数间传递


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *func(int *cp(void* , void*), void *data1, void *data2){ 
(*cp)(data1,data2);
}

int *cmp(void* dest, void* src)  //这个函数的目的是 将src里的数值,给dest,本函数有问题,高人可直接给出正确的
{
int num1,num2;
num1 = (int)dest;  //调试时这里的地址跟main里的一样,数值无法打印,打印的是一个长串负值
num2 = (int)src;
num1=num2;
dest=(void*)num1;
return (void*)0;
}
int main(void)
{
int ret;
int num1=7;
int num2=4;
// printf("main:%d,%p\n",&num1,&num1);
// printf("main:%d,%p\n",&num2,&num2);
ret= (int)(*func)( cp , &num1, &num2);

printf("%d\n",num1);//我的目的是num1是4,但打印的是7,上面的函数调用没有起到明显的效果
return ;
}

23 个解决方案

#1


从代码看,cmp里面只是在自己的作用域里进行数据计算,指针数值的交换,没有任何涉及具体位置内存的拷贝粘贴,所以主程序中两个变量没有变化是正常的

#2


#include <stdlib.h>

#include <stdio.h>
#include <string.h>

int func(int (*cp)(void* , void*), void *data1, void *data2){ 
    return cp(data1,data2);

}

int cp(void* dest, void* src)  //这个函数的目的是 将src里的数值,给dest,本函数有问题,高人可直接给出正确的
{
    int num1,num2;
    num1 = (int)dest;  //调试时这里的地址跟main里的一样,数值无法打印,打印的是一个长串负值
    num2 = (int)src;
    num1=num2;
    dest=(void*)num1;
    return 0;
}
int main(void)
{
    int ret;
    int num1=7;
    int num2=4;
//    printf("main:%d,%p\n",&num1,&num1);
//    printf("main:%d,%p\n",&num2,&num2);
    ret= func( cp , &num1, &num2);

    printf("%d\n",num1);//我的目的是num1是4,但打印的是7,上面的函数调用没有起到明显的效果
    return 0;
}

							     

#3


帮你改了一下,lz的根本编译不过啊,好多定义都错误了。
还有要实现lz要求的功能是不行的啊,函数是值传递,int cp(void* dest, void* src) 这里的dest和src都相当于一个副本,修改这个的值根本不能修改到主函数的值

#4



#include <stdio.h>
#include <string.h>

char *func(int *cp(void* , void*), void *data1, void *data2){ 
    (*cp)(data1,data2);
return NULL;
}

int *cmp(void* dest, void* src)  //这个函数的目的是 将src里的数值,给dest,本函数有问题,高人可直接给出正确的
{
    
    *(int*)dest = *(int*)src;  //调试时这里的地址跟main里的一样,数值无法打印,打印的是一个长串负值
    return (int*)0;
}
int main(void)
{
    int ret;
    int num1=7;
    int num2=4;
//    printf("main:%d,%p\n",&num1,&num1);
//    printf("main:%d,%p\n",&num2,&num2);
    ret= (int)(*func)( cmp , &num1, &num2);

    printf("%d\n",num1);//我的目的是num1是4,但打印的是7,上面的函数调用没有起到明显的效果
    return 0;
}

#5


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//char *func(int *cp(void* , void*), void *data1, void *data2){ 
//这里你是想func函数中的参数是个函数指针,不能这样定义
//定义一个函数指针是这样的 int (*func)(), 注意括号
int func(int (*cp)(void* , void*), void *data1, void *data2){ 
    return cp(data1,data2);
}

int cp(void* dest, void* src)  //这个函数的目的是 将src里的数值,给dest,本函数有问题,高人可直接给出正确的
{
    *(int*)dest = *(int*)src;  //直接这样赋值就可以了
    return 0;
}
int main(void)
{
    int ret;
    int num1=7;
    int num2=4;

//ret= (int)(*func)( cp , &num1, &num2);  调用函数没见过这样用的,就算定义char *func();也只是func的返回值是char*
    ret= func( cp , &num1, &num2);

    printf("%d\n",num1);//我的目的是num1是4,但打印的是7,上面的函数调用没有起到明显的效果
    return 0;
}

							     

#6


改好了,这样就可以了

#7



#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int func(int (*cp)(void* , void*), void *data1, void *data2)

    return (*cp)(data1,data2);
}

int cmp(void* dest, void* src)
{
    *((int*)dest) = *((int*)src);//这样强制类型其实转换不太好
    return 0;
}

int main(void)
{
    int ret;
    int num1=7;
    int num2=4;

ret= func(cmp , &num1, &num2);

    printf("%d\n",num1);
    return 0;
}

#8


谢4楼,正解,

*(int*)dest = *(int*)src;  能简单说下么,为什么这么写?

#9


*(int*)dest先把dest转换为指向int类型的指针,然后取值...如果楼主要实现其他的类型转换,那就要另做考虑了..

#10


mark先

#11


引用 9 楼 feng4206yu 的回复:
*(int*)dest先把dest转换为指向int类型的指针,然后取值...如果楼主要实现其他的类型转换,那就要另做考虑了..

这个能看明白,我想知道的是,为什么要这样用,从实参到形参,到函数体里指针的引用,是怎么个过程,究竟是怎么传递的???

为什么在函数里直接使用这个指针不能赋值呢?

#12


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *func(int *cp(void* , void*), void *data1, void *data2){ 
    (*cp)(data1,data2);
return NULL;
}

int *cmp(void* dest, void* src)  //这个函数的目的是 将src里的数值,给dest,本函数有问题,高人可直接给出正确的
{
memcpy(dest, src, sizeof(int));
    return NULL;
}


int main(void)
{
    int ret;
    int num1=7;
    int num2=4;
    ret= (int)(*func)( cmp , &num1, &num2);

    printf("%d\n",num1);//我的目的是num1是4,但打印的是7,上面的函数调用没有起到明显的效果
    return 0;
}

#13


引用 11 楼 greatinghk 的回复:
引用 9 楼 feng4206yu 的回复:
*(int*)dest先把dest转换为指向int类型的指针,然后取值...如果楼主要实现其他的类型转换,那就要另做考虑了.. 
 
这个能看明白,我想知道的是,为什么要这样用,从实参到形参,到函数体里指针的引用,是怎么个过程,究竟是怎么传递的??? 

为什么在函数里直接使用这个指针不能赋值呢?



int cp(void* dest, void* src) 

    *(int*)dest = *(int*)src;  //这里,是将src指向的地址上的值赋值给dest指向的地址。因为传递过来的是一个地址,指针指向的是num1.num2的地址,故,修改指针指向的地址上的值,就是修改num的值 
    return 0; 


    ret= func( cp , &num1, &num2); //传地址过去

#14


引用 11 楼 greatinghk 的回复:
引用 9 楼 feng4206yu 的回复:
*(int*)dest先把dest转换为指向int类型的指针,然后取值...如果楼主要实现其他的类型转换,那就要另做考虑了.. 
 
这个能看明白,我想知道的是,为什么要这样用,从实参到形参,到函数体里指针的引用,是怎么个过程,究竟是怎么传递的??? 

为什么在函数里直接使用这个指针不能赋值呢?

函数是值传递的,所以形参相当于函数实参的一个副本,只是值相同而已,这2个东西存储的地址是不同的。
举个简单的例子,
int a, b; //假设这里a是实参,b是形参。
a=1; //把实参赋值为1
b=a; //形参b的值赋值给实参啊,可以看做函数调用。
b=2; //这里你看做在子函数里面,改变形参的值,但实际实参a的值还是1

如果是传地址,假如
int n=1;
int m=2;
int *a, *b; //同样假设a是实参,b是形参。
a=&n; //实参a赋值指向n
b=a;  //形参b的值赋值给实参啊,可以看做函数调用。
*b=2; //对形参b做解引用,赋值2,想想这时n的值变了没有
b=&2; //假如这样直接给b赋值,a是没有任何改变的

要弄明白函数传参是值传递的意思。



#15


基础得不能再基础了

#16


char *func(int *cmp(void* , void*), void *data1, void *data2){
(*cmp)(data1,data2);
}
int *cmp(void* dest, void* src)
{
int num1,num2;
num1 = (int)dest;
num2 = (int)src;
num1=num2;
printf("cmp:%p\n",num1);
printf("cmp:%p\n",dest);
printf("cmp:%d\n",(int)(dest));
dest=(void*)num1;
return (void*)0;
}
int main(void)
{
int ret;
int num1=7;
int num2=4;
printf("main:%d,%p\n",&num1,&num1);
printf("main:%d,%p\n",&num2,&num2);
ret= (int)(*func)( cmp , &num1, &num2);
printf("%d\n",num1);
return ;
}

在贴一下错误的代码,
楼上说的我明白,但是写了这个有问题的代码,有迷茫了
看下输出:
main:-1080949076,0xbf9206ac
main:-1080949080,0xbf9206a8
cmp:0xbf9206a8
cmp:0xbf9206ac
cmp:-1080949076
7
注意main里和cmp里输出的地址。。。
我不知到该怎么解释这个????

#17


注意你这里打印的是什么,是参数的值而不是参数的地址。(虽然这里的参数是指针)
实参和形参的值肯定是一样的,但是储存的地址不一样,所以是2个不同的东西。
但是正是由于他们的值是一样的,所以当实参和形参是指针的情况下,对他们做解引用,这样就能改变主函数中变量的值
lz仔细想想

#18


用static_cast进行类型转换
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *func(int *cp(void* , void*), void *data1, void *data2){ 
    (*cp)(data1,data2);
return NULL;
}

int *cp(void* dest, void* src)
 {
int *a, *b;
a = static_cast<int *>(dest);
b = static_cast<int *>(src);
*a = *b;
    return (int*)0;
}
int main(void)
{
    int ret;
    int num1=7;
    int num2=4;
//    printf("main:%d,%p\n",&num1,&num1);
//    printf("main:%d,%p\n",&num2,&num2);
    ret= (int)(*func)( cp , &num1, &num2);

    printf("%d\n",num1);//我的目的是num1是4,但打印的是7,上面的函数调用没有起到明显的效果
    return 0;
}

#19


再仔细看看!!楼主努力

#20


引用 17 楼 wyswyg63 的回复:
注意你这里打印的是什么,是参数的值而不是参数的地址。(虽然这里的参数是指针) 
实参和形参的值肯定是一样的,但是储存的地址不一样,所以是2个不同的东西。 
但是正是由于他们的值是一样的,所以当实参和形参是指针的情况下,对他们做解引用,这样就能改变主函数中变量的值 
lz仔细想想


谢谢,是我的思维进入了误区,

还有个问题:
 *(int*)dest = *(int*)src;  
对于这行代码
我写成这个样子   (int)(*dest) = (int)(*src);  //先将void×取值,在强转int  ,为什么不行,是void×不知道容量无法取值么???

#21


应该是这样的,你根本不知道*dest占几个字节就直接用解引用,肯定会出问题的

#22


好了结贴,谢谢各位。。

#23


引用 7 楼 xiaoyisnail 的回复:
C/C++ code#include<stdlib.h>#include<stdio.h>#include<string.h>intfunc(int(*cp)(void*,void*),void*data1,void*data2)
{return(*cp)(data1,data2);
}intcmp(void*dest,void*src)
{*((int*)dest)=*((int*)src);//这样强制类型其实转换不太好return0;
}intmain(void)
{intret;intnum1=7;intnum2=4;

    ret=func(cmp ,&num1,&num2);

    printf("%d\n",num1);return0;
}

你说的这样强制类型其实转换不太好,那用什么方法比较好
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告