一级指针与二级指针的定义以及使用详解

一级指针与二级指针的定义以及使用详解

首先说下一级指针和二级指针概念:
一级指针:
int a;
int *p;//指针指向地址
p = &a;
&p//指针所在内存的地址
p//指针p的值,也就是所指向内存区的地址(a的地址)
*p//*是解引用,意思是取指针指向地址的内容即:取p所指向内存区内的值(a的值)


二级指针:
int a;
int *p;//指针指向地址
int **q;//二级指针指向指针的指针
q = &p//q指向一个指针
&q//指针q所在内存区的地址
q//指针q的值,也就是p所在内存区的地址,等同于&p
*q//指针q所指向内存的值,也即是指针p的值,等同于p(a的地址)
*是解引用,意思是取指针指向地址的内容

**q //a的值也就是取指针p指向的地址储存的值;由于二级指针q指向指针p(因为q指向指针p的地址,*p就是取指针p地址的内容就是指针p,所以符号表示q=&p;*q=p),指针p又指向a的地址(因为p指向a的地址,*p就是取a地址的内容就是a的值,所以符号表示p=&a ),综上# **p就是取指针p指向地址的内容即a地址的内容:a的值。


图解如下
在这里插入图片描述

#include<stdio.h>
int a = 2, b = 3;
int * q;
void fun(int *p)//形参指针p(一级指针),此时p指向a的地址,即有*p等于a的值为2
{
    printf("?%d\n",*p);//形参p指向a地址,*p取a地址的值 2
    //p = &b;//更改的是子函数里面的指针p的指向,将其指向b,与a无关因此影响不了a的值。
    printf("%d\n",*p);
    *p = b;//前提p = &b;已注释 传入参数时p就和主函数q相同,q指向什么p就指向什么。由于q指向a的地址,所以p也指向a的地址,所以*p就是取a地址的内容。相当于a=b 影响a的值,a的值变为3
    printf("%d\n",*p);
    /*
    p=&b和*p = b同时使用改变不了a的值?
    若p=&b和*p = b同时使用,由于前一句已将形参中指针p指向b的地址,所以进行下一句改变值得时候就是将b地址的内容等于b,与a值无关*/
}
int main()
{
    q = &a;
    printf("%d\n",*q);
    fun(q);//将q指针赋值给子函数形参指针p,相当于子函数新建一个int类的一级指针q,并将主函数q指针复赋值给子函数的一级指针p
    printf("%d\n",*q);
    return 0;
}

实例1运行结果
如果p=&b不注释
结果:子函数最后指针p指向的内容未被更改且星号(字符打不出来)p(即a的值)的值也未更改
因为fun(q)传入的是指针的值(由于指针q是指向a的地址所以指针的值就是&a(a的地址),所以子函数的形参指针p也是指向a的地址),将指针q的值赋值给子函数的形式参数指针p,p=&b只是将子函数中指针p的值改为b的地址即:子函数中指针p现在指向b,所以值等于3。子函数里面的星号(字符打不出来)p的值与主函数的星号(字符打不出来)q无关,q还指向a的地址所以星号(字符打不出来)q还是等于2。因为在传入参数时,子函数重新开辟了一个内存空间给传入的指针相当于复制了指针q的值放到开辟的那个内存空间。
在这里插入图片描述
如果星号(字符打不出来)p=b不注释
结果:子函数最后指针p指向的内容被更改且*p(即a的值)的值也被更改
不同之处,*p=b改了用a的地址改了a的值将其变为b的值
子函数形式参数指针p指向的是a的地址,*p就是取地址的值也就是取a的地址相当于取了a地址的内容并且将b赋值给a。*p=b等价于a=b
在这里插入图片描述

#include<stdio.h>
int a = 2, b = 3;
int * q;
/*
指针指向地址
指针q指向a的地址
子函数里面的二级指针p,主函数调用时将一级指针q的地址赋值给二级指针p
就有二级指针p指向指针q的地址,*p取指针q的地址的内容(即指针q),指针q指向a的地址,所以*p指向的是a的地址
**p和*q都是取出q地址的内容(即a的值2)
*/
void fun2(int **p)//形参p(二级指针)
{
    //**p = b;//改值:取a地址的值(即a)并将其改为b值,等价于a=b; 影响:主函数a的值改变
    *p=&b;//改地址:*p指向的是a的地址,所以将a的地址指向b的地址,即把a的值改为b。影响:主函数a的值改变
}
int main(void)
{
    q = &a;
    printf("%d\n",*q);//图片结果第一行
    fun2(&q);
    printf("%d\n",*q);//图片结果第二行
    return 0;
}

实例2运行结果(注释了子函数**p = b)
代码注释已解释为什么值是下图结果。
在这里插入图片描述

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值