5.疯狂指针-贰

转载请标明出处: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! 因为rint***类型只能存放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)指明该指针变量的数据类型为: 类型名 * 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值