我遇到的问题:
我需要 头指针 来传递给 print函数 ,但我不知把头指针定义在主函数,还是自定义函数里,
因此我想用多级指针,
在print函数里,设置形参 sd ** a和int n
void print(sd** head ,int n)//n为结点
{
}
然后调用这个函数时,print(head,5)
我误认为head是一个指向sd类型的变量,因此需要多级指针来接受 head这个实参
后来意识到:
int a;
int *p=&a;
这时,假如把实参&p,传递给一个函数,这时
接受它的实参应该为int**类型
但当我传递p给一个函数,p=&a
实际上是把 a的地址传给这个函数,用int*的实参就可以接收&a这个形参
然后,类比到我定义的 sd* head类型的变量,传递head只需要sd*就可以接收,不需要多级指针
用下面这个sd*类型作为型参就行
void print(sd* head ,int n)//n为结点
{
}
下面是我创建链表的部分代码:
#include <iostream>
using namespace std;
typedef struct sd
{
struct sd* next;
int num;
}stu;
void creat(int n)//n为结点数 ,用来创建一个含有n个结点的链表
{
stu* head;
head = new stu;
stu* pr;
stu* pf;
//stu* head;
//head = new stu;
//p = head;
cin >> head->num;
pr = head;
for (int i = 0;i < n-1;i++)
{
stu* p = new stu;
cin >> p->num;
pr->next = p;
pr = pr->next;
}
pr ->next= NULL;//令下一个结点的指针域为0
//cout << pr<<endl;
pf = head;
while (pf!= NULL)
{
cout << pf->num;
pf = pf->next;
cout<<endl;
}
}
void print()//用来输出链表中的每个结点
{
}
int main()
{
//p = head;
creat(5);
return 0;
}
下面来自百度百科的多级指针知识:
定义和变量定义
设有基类型为int的指针变量p定义如下:
int *p,n;
变量p的类型为int*,指针变量p可存贮一个int类型变量(例如n)的地址:
p=&n; /* n的地址存贮到指针p中,即,使p指向n */
记p的类型(int*)为T,即,p是T类型的变量。
可使用基本运算(&)
&p
来计算指针变量p的地址。上面基本运算的结果是T* 类型的,即,是
T* ≡ (int*)* ≡ int**
类型的,即是基类型为int的指针变量的地址,是基类型为int的二级指针。
若要把上面的计算结果存贮到一个变量中,我们需要定义一个T*类型的
指针变量,例如q:
T *q; ≡ (int*)*q; ≡ int **q;
变量q被称为基类型为int的二级指针变量。
下面的处理使q指向p:
q=&p;
下图1描述了int类型变量n、基类型为int的一级指针p、基类型为int的
二级指针q之间的关系:
一般地,K级指针变量的地址是K+1级指针类型的。实用上,二级指针的使用 最为广泛,三级以上的指针很少使用。