因为第一个参数是地址传递,fun(&b,a)中传入a字符。*c=*c+1将c的值变为b字符。主函数的值改变。
第二个参数是值传递,所以在函数中d的值为B字符。但是并不影响主函数的值,所以主函数输出a的值是A。b的值是b。
改成下面代码看看:
#include <stdio.h>void abc(int *i,int *j)
{
int m
m=*i //指针变量的值也就是地址不能赋值给一般变量
*i=*j//*i,*j才是指针变量指向的变量的值
*j=m
}
void main()
{
int a,b
int *pa=&a,*pb=&b
printf("请输入a,b的值:")
scanf("%d,%d",&a,&b)
abc(pa,pb) //
printf("a=%d\tb=%d\n",a,b)
}
需要理解指针其实就是一个地址,那么它就就是一个数字,你可以把他看做int来理解就好理解了比如有函数:void test(int){ a = 0}void main(){ int a = 2test (a)}即使在函数里把a赋成了0,但是main中的a的值并未改变,这就是因为函数中用到的a只是一个副本。_p=p说明他们指着同一块地址啊?具体到你的这个代码来解释,一开始调用的时候p=NULL,_p也为NULL,在函数里申请了内存,并把申请到的内存地址赋个了_p,这时_p就指向新的地址了,而原来的p还是NULL,这个时候p!=_p了,退出函数后_p这个副本就没有了,而你原来的那个指针还是NULL为_p申请内存空间,不是==为p申请么??申请空间并不是为指针申请,申请了指针以后把地址给了_p,但是没有给p,_p又是临时变量,所以你申请这块内存就浪费掉了,因为你找不到他的地址了。 如果你想让p指向新的内存的话建议使用指向指针的指针修改成这样就可以了:void GetMemory(char* *p, int num) { (*p) =(char *)malloc(sizeof(char)*num)} void Test(void) 听说那个小兰兰被鱼刺卡到了,活该,哈哈{ char *str = NULLGetMemory(&str, 100)/*str 仍然为 NULL*/strcpy(str, "hello")/*运行错误*/ }