3个回答
展开全部
用内存地址去理解吧,一级指针是指向定义类型的内存地址,二级指针就是指向定义类型的内存地址所指向的新的内存地址。我举一个例子。
#include <stdio.h>
void main()
{char *day[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
char **p;
int n;
printf("请输入日期:\n");
scanf("%d",&n);
printf("对应英语日期:%s\n",*(p n-1));/* *(p n-1)还是指针,指向的n-1位元素的首地址 */}
这就是二级指针的用法,定义一个指针数组*day[]里面包含7个字符串,如果你想输出字符串,你就需要一个二级指针,因为一级指针只能寻址到字符串所在的位置,如:n=3,*p则能找到星期三所在的位置而已,并不能将其输出,因为没有其首地址,而**p则完成二级寻址,找到了星期三,也找到了它的首地址,所以能输出(字符串输出指针移动是系统自动移动的)
#include <stdio.h>
void main()
{char *day[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
char **p;
int n;
printf("请输入日期:\n");
scanf("%d",&n);
printf("对应英语日期:%s\n",*(p n-1));/* *(p n-1)还是指针,指向的n-1位元素的首地址 */}
这就是二级指针的用法,定义一个指针数组*day[]里面包含7个字符串,如果你想输出字符串,你就需要一个二级指针,因为一级指针只能寻址到字符串所在的位置,如:n=3,*p则能找到星期三所在的位置而已,并不能将其输出,因为没有其首地址,而**p则完成二级寻址,找到了星期三,也找到了它的首地址,所以能输出(字符串输出指针移动是系统自动移动的)
参考资料: 如果您的回答是从其他地方引用,请表明出处
展开全部
指针就是指针,你不要老想着什么二级还是三级,就见怪不怪了
比如说,一个链表栈:
struct TStack {
int data;
struct TStack * next;
};
这个链表里面每个元素都是一个struct TStack *指针。那么怎样写函数,才能通过函数参数进行指针的管理呢?比如两个操作push(top, new_item)和pop(top, new_item),这时就用到了二级指针。为了便于理解,我们这样定义:
typedef struct TStack * PStack ;
然后这样定义push:
void push(PStack * top, int new_item)
{
PStack n = new PStack;
n->data = new_item;
n->next = *top;
*top = n;
}
这样就通过取参数top的指针完成了对新元素压栈的操作,上面的函数声明等同于
void push(struct TStack ** top, int new_item);就是二级指针了
这样的话你用的时候就不用考虑这个栈的第一个元素需不需要初始化的问题
int main(void)
{
int data = 0; struct TStack * top = 0;
do {
scanf("%d", &data);
push(&top, data); /*注意取指针top的地址*/
...
} while(data);
return 0;
}
聪明的你一定会问,为什么不能写void push(struct TStack * top, int data)呢?
观察程序体就会发现,如果这样写,其实top是不可以被修改的变量,后面的程序虽然 n->next = top没有问题,但是如果想调整top = n就会在编译器上出错,因为top是个地址,在调用函数的时候参数本身不能被修改,除了指针除外
所以我们引用二级指针,表示指针本身的地址保持不变,其地址指向的内容能为我所用。
不知道您看明白没有?
比如说,一个链表栈:
struct TStack {
int data;
struct TStack * next;
};
这个链表里面每个元素都是一个struct TStack *指针。那么怎样写函数,才能通过函数参数进行指针的管理呢?比如两个操作push(top, new_item)和pop(top, new_item),这时就用到了二级指针。为了便于理解,我们这样定义:
typedef struct TStack * PStack ;
然后这样定义push:
void push(PStack * top, int new_item)
{
PStack n = new PStack;
n->data = new_item;
n->next = *top;
*top = n;
}
这样就通过取参数top的指针完成了对新元素压栈的操作,上面的函数声明等同于
void push(struct TStack ** top, int new_item);就是二级指针了
这样的话你用的时候就不用考虑这个栈的第一个元素需不需要初始化的问题
int main(void)
{
int data = 0; struct TStack * top = 0;
do {
scanf("%d", &data);
push(&top, data); /*注意取指针top的地址*/
...
} while(data);
return 0;
}
聪明的你一定会问,为什么不能写void push(struct TStack * top, int data)呢?
观察程序体就会发现,如果这样写,其实top是不可以被修改的变量,后面的程序虽然 n->next = top没有问题,但是如果想调整top = n就会在编译器上出错,因为top是个地址,在调用函数的时候参数本身不能被修改,除了指针除外
所以我们引用二级指针,表示指针本身的地址保持不变,其地址指向的内容能为我所用。
不知道您看明白没有?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
main()
{
int a[5]={1,3,5,7,9};
int *num[5],i;
int **p;
for(i=0;i<5;i++)
num[i]=&a[i];
p=num;
for(i=0;i<5;i++)
{
printf("%d ",**p);p++;
}
}
#include<stdio.h>
main()
{char *name[]={"Follow me","BASIC","Grate Wall","FORTRAN","Computer design"};
char **p;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf("%s\n",*p);
}
}
指向指针数据的指针用的是“二级间址”方法,从理论上说,间址方法可以延伸到更多的级,即多重指针。但实际上在程序中很少有从超过二级间址的。级数愈多,愈难理解。
main()
{
int a[5]={1,3,5,7,9};
int *num[5],i;
int **p;
for(i=0;i<5;i++)
num[i]=&a[i];
p=num;
for(i=0;i<5;i++)
{
printf("%d ",**p);p++;
}
}
#include<stdio.h>
main()
{char *name[]={"Follow me","BASIC","Grate Wall","FORTRAN","Computer design"};
char **p;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf("%s\n",*p);
}
}
指向指针数据的指针用的是“二级间址”方法,从理论上说,间址方法可以延伸到更多的级,即多重指针。但实际上在程序中很少有从超过二级间址的。级数愈多,愈难理解。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询