关于对指针的操作的问题,会者不难
我想要给一个指针申请一段内存,写了如下这些函数
int* pp0(int* p){ if (p!=NULL) return p; p=(int*)malloc(20); return p;}void pp1(int* p){ if (p!=NULL) return p; p=malloc(20);}void pp2(void** p){ if (*p!=NULL) return ; *p=malloc(20); }void test2(){ int* p0=NULL,p1=NULL,p2=NULL; p0=pp0(p0);//这是我想要的效果,即返回了内存地址,但是需要填写两边p0,我想只填写一遍,即没有前面的“p0=” pp1(p1);//这样做内存泄露了,p1还是指向NULL pp2(&p2);//这样做P2里成了存储了一个数字了,也不是我想要的结果}
void pp(void *p){ unsigned int addr; __asm { mov edx,[p] mov dword ptr[addr],edx } void * pVoid =NULL; pVoid = malloc(20); __asm { mov edx,dword ptr[pVoid] mov ecx,dword ptr[addr] mov dword ptr[ecx],edx }}使用: int *p= NULL; pp(&p);
[解决办法]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
[解决办法]
int* p0=NULL,p1=NULL,p2=NULL;
首先你这样的定义不对,可能是你笔误,这时p1,p2是整形,而不是指针
[解决办法]