转载请标明出处:http://blog.csdn.net/u012637501
多级指针
指针变量保存的是指向变量地址,有点需要区别:
1. 数据类型 * 变量名:* 表示该变量为指针变量,存放的是(数据类型)变量的存储地址,如int
*p=&i;
2. * 指针变量:*表示指向"以指针变量的内容为存储地址的变量",如*p=i;
§举例1:多级指针的关系
#include <stdio.h>
int main(void)
{
int i = 10;
// i
int *p = &i;
// 最终 *p就是 i,p存放的是int类型变量的地址;
int* *q = &p;
// q 只能存放 int * 类型的地址 即p 的地址&p
int** *r = &q;
// r 只能存放 int ** 类型的地址 即q 的地址&q
//r = &p; //error! 因为r是int***类型,只能存放int **类型变量的地址
printf("i = %d\n", ***r); //*r = q; **r = *q =p ***r = **q = *p = i;
printf("i = %d\n", **q); //*q = p ; **q = *p === i
printf("i = %d\n", *p); //*p = i;
printf("i = %d\n", i);
return 0;
}
◆运行结果:
◆内存分析
§举例2:多级指针在函数中的调用
#include <stdio.h>
//多级指针在函数中的应用
//▲重要:q=&p,其中q为int
**类型
void f(int ** q)
{
**q = 100;//*q就是p,q=&p->*q=*&p=p->*(*q)=*p=i
}
void g()
{
int i = 10;
int * p = &i; //可得到*p=i
printf("i = %d *p = %d\n", i, *p);
f(&p); //p是int *类型
&p就是int ** 类型
printf("i = %d *p = %d\n", i, *p);
}
int main(void)
{
g();
return 0;
}
◆运行结果:
◆内存分析:
§举例3:多级指针在函数中的调用
#include <stdio.h> #include <malloc.h> void f(int * q) //q是p的拷贝副本 q=p { *q = 1; } void g(int **r) { **r = 2; } void h(int ***s) { ***s = 3; } void i(int ****t) { ****t = 4; } //要想修改函数变量的值,只能发送该变量的地址,修改一个以上的值,必须用指针 int main(void) { int *p = (int *)malloc(4); //开辟大小为4字节的内存空间,将内存首地址赋值给指针变量p printf("*p = %d\n", *p); //垃圾值 f(p); //调用的是指针(将指针变量保存的地址作为实参传递) printf("*p = %d\n", *p); //*p=*q=1 g(&p);//调用的是指针变量的地址(将指针变量的地址作为实参传递,&p相当于int **类型) printf("*p = %d\n", *p); //2 //h(&(&p));// error C2102: '&' requires l-value int **pp = &p; //pp是存放p地址的指针,int ** 整型指针的指针类型 h(&pp); //调用的是存放p指针的指针的地址 int ***整型指针的指针的指针类型 printf("*p = %d\n", *p); //3 int ***ppp = &pp; i(&ppp);//调用的是一个三级指针的指针的地址,int **** 整型四级指针 printf("*p = %d\n", *p); //4 return 0; }
◆运行结果:
◆说明分析:
(1)int *p=&i:指针变量p存放的是int类型变量(i)的地址,该指针变量p为int
*类型变量;
(2)int * *pp=&p:指针变量pp存放的是int *类型变量(p)的地址,该指针变量pp为int
**类型变量;
(3)int ** *ppp=&pp:指针变量ppp存放的是int **类型变量(pp)的地址,该指针变量ppp为int
***类型变量;
(4)void f(int *q):需要传递int 类型变量的地址作为参数,如指针变量p
(其内容即为int类型变量的地址)
(5)void g(int * *r):需要传递int *类型变量的地址作为参数,如指针变量p的地址&p
(6)void h(int ** *s):需要传递int
**类型变量的地址作为参数,如指针变量pp的地址&pp
(7)void i(int *** *t) :需要传递int
***类型变量的地址作为参数,如指针变量ppp的地址&ppp.
注:*变量名,其中*有两个作用:(1)声明变量为指针变量,只能存放地址;
(2)指明该指针变量的数据类型为: 类型名
*