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()中把一个指针的地址(即:双重指针)传进去;
#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()中把一个指针的地址(即:双重指针)传进去;
相关文章推荐
- C语言一级指针、二级指针、数组作为参数传递需要注意的若干问题
- C语言指针作参数为非引用传递
- C语言中,数组名作为参数传递给函数时,退化为指针
- C语言之使用指针数组传递参数
- C语言中,数组名作为参数传递给函数时,退化为指针
- (转载) C语言技巧:怎样把数组作为参数传递给函数?(值传递和指针传递)
- c语言 函数 用指针传递参数 问题
- C语言中,数组名作为参数传递给函数时,退化为指针
- C语言 数组名作为参数传递 数组名发生退化成指针
- C语言数组与指针作为传递参数的使用
- c语言 函数 用指针传递参数 问题
- C语言中,数组名作为参数传递给函数时,退化为指针
- 指针参数是如何传递内存
- 关于C语言通过函数传递多个数据————指针的应用
- Unity使用C#调用C++dll传递指针参数、接收指针返回值
- 参数传递之指针传递
- 《IOS_作业C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- CreateThread传递多个参数的方法(利用结构体的参数指针)
- 函数参数的传递问题(一级指针和二级指针)
- 漫谈C指针:参数传递的三道题目