您的位置:首页 > 编程语言 > C语言/C++

C语言中的指针参数传递小结 (2005-7-5)

2005-07-06 12:03 519 查看
#include
#include
typedef struct dlink{
int ch;
struct dlink *pFront;
struct dlink *pNext;
}Dlist;

Dlist *buildDlink(int num);
void prtDlink(Dlist *hedp, Dlist *temP);

int main()
{
int num;
Dlist *hedp;
Dlist *temP = (Dlist *)malloc(sizeof(Dlist));

hedp = buildDlink(9); //建立含9个元素的双向链表
printf("/nThe doubelink list is :");
prtDlink(hedp, temP); //希望通过temP返回指向双向链表尾(相对于头来讲)的指针.
printf("/n In main , temp->ch = %c", temP->ch); //这里打印不出信息.
return 0;
}

//根据num,建立一个双向链表
Dlist *buildDlink(int num)
{
int i;
Dlist *hedp, *p, *pNode;

hedp = p = (Dlist *)malloc(sizeof(Dlist));
hedp->ch = 'a';
hedp->pFront = hedp;
hedp->pNext = hedp;
for(i = 0; i < num-1; i++){
pNode = (Dlist *)malloc(sizeof(Dlist));
pNode->pFront = p;
pNode->pNext = hedp;
p->pNext = pNode;
hedp->pFront = pNode;
pNode->ch = 'a'+i+1;
p = p->pNext;
}
return hedp;
}

//打印整个双向链表,并且希望通过tP指针返回指向表尾的指针
void prtDlink(Dlist *hedp, Dlist *tP)
{
int calc = 1;
Dlist *p = hedp;

if(p->pNext == hedp){
printf("/nOnly one element : %c", p->ch);
}
else{
while(p->pNext != hedp){
printf("/nNO%d element: %c", calc, p->ch);
calc++;
p = p->pNext;
}
printf("/nNO%d element: %c", calc, p->ch);
}
tP = p;
printf("/n In prtDlink , temp->ch = %c", tP->ch); //这里可以打印出信息.即末尾的元素
}

-------------------------------------------------------------------------------
以上程序有问题,下面是经过修改后的程序!
-------------------------------------------------------------------------------

#include
#include
typedef struct dlink{
int ch;
struct dlink *pFront;
struct dlink *pNext;
}Dlist;

Dlist *buildDlink(int num);
void prtDlink(Dlist *hedp, Dlist **temP);

int main()
{
int num;
Dlist *hedp;
Dlist *temP = (Dlist *)malloc(sizeof(Dlist));

hedp = buildDlink(9); //建立含9个元素的双向链表
printf("/nThe doubelink list is :");
prtDlink(hedp, &temP); //把一重指针的地址传进去
printf("/n In main , temp->ch = %c", temP->ch);
free(temP);
return 0;
}

//根据num,建立一个双向链表
Dlist *buildDlink(int num)
{
int i;
Dlist *hedp, *p, *pNode;

hedp = p = (Dlist *)malloc(sizeof(Dlist));
hedp->ch = 'a';
hedp->pFront = hedp;
hedp->pNext = hedp;
for(i = 0; i < num-1; i++){
pNode = (Dlist *)malloc(sizeof(Dlist));
pNode->pFront = p;
pNode->pNext = hedp;
p->pNext = pNode;
hedp->pFront = pNode;
pNode->ch = 'a'+i+1;
p = p->pNext;
}
return hedp;
}

//打印整个双向链表,并且希望通过tP指针返回指向表尾的指针
void prtDlink(Dlist *hedp, Dlist **tP)
{
int calc = 1;
Dlist *p = hedp;

if(p->pNext == hedp){
printf("/nOnly one element : %c", p->ch);
}
else{
while(p->pNext != hedp){
printf("/nNO%d element: %c", calc, p->ch);
calc++;
p = p->pNext;
}
printf("/nNO%d element: %c", calc, p->ch);
}
*tP = p;
printf("/n In prtDlink , temp->ch = %c", (*tP)->ch); //这里可以打印出信息.即末尾的元素
}

总结:
如果在做一重指针传递参数的时候,编译器会分配一个传进来的指针的副本, 而在函数里操作的是这个指针副本,所以如果副本指针指向的内容发生改变后(只要涉及到在子函数中对指针指向的内容进行改变就会发生这种情况),原来传进来的指针并没有发生变化!!!所以想通过一重指针把改变后的指针带出来就不行了!!!
要么可以用
1. return 堆指针; (注意这里不能return栈指针);
2. 通过双重指针传递参数, 在main()中把一个指针的地址(即:双重指针)传进去;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息