C语言的灵魂—指针

C语言的灵魂—指针

指针是什么

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。总结来说,指针就是指向地址的变量!

指针的作用

c语言指针可以有效地表示复杂的数据结构、动态分配内存、高效地使用数组和字符串、使得调用函数时得到多个返回值等。指针的应用往往与数组联系在一起,是最频繁的,也是最基础的。参数传递时只需要拷贝地址值,提高程序的运行效率。有效的表示数据结构,能动态分配内存。

指针

指针的语法

指针变量的定义: 类型 * 指针变量名
&:表示取地址操作
*: 表示取地址中的值

怎么去理解指针

大家可能一时半会可能很难理解指针含义。我们的计算机都会有一个内存,并且这个内存的每一个部分有一个标记表示它的位置,这个标识就是我们的地址,地址对应的区域存放的就是我们的数据(值)。就像我们住酒店,酒店是内存,门牌号是我们的地址,住在房间里的人就是我们的数据!

代码示例

#include<stdio.h>

int main(){
    int num = 10;
    double num2 = 10.0;
    int * p ;
    p = &num;

    //这种不同类型的变量之前的操作是不合法的
    // p = &num2;

    printf("p = %p\n",p);
    printf("num = %d\n",num);
    printf("*p = %d\n",*p);

    // num 和 p代表的是同一个地址的数据,
    // 当使用 *p 去修改数据的时候,num代表的数据也会改变!
    *p = 11;
    printf("p = %p\n",p);
    printf("num = %d\n",num);
    printf("*p = %d\n",*p);

    return 0;
}

/*
    运行结果:
        p = 0x7ffee1eee7c8
        num = 10
        *p = 10
        p = 0x7ffee1eee7c8
        num = 11
        *p = 11
*/

通过以上代码我们不难理解:指针变量中,p 存放的是地址,*p 是取地址对应的值。num 变量直接存放地址对应的值!当我们使用 *p 修改数据的时候,我们 num 的存放的值也会发生改变!我们使用 & 符号即可取出变量的地址
举个例子,p 存放的是门牌号,*p 代表居住的客人,num 也是代表这个门牌号下居住的客人,当使用 *p 修改掉居住的人,num 也会发生相应的改变,因为他们代表的都是这个门牌号下居住的人。&num 即代表取出这个客人的房间门牌号

什么是双重(n重)指针

我们根据之前的解释可以知道,每个变量在内存中都有一个地址相对应。双重指针实际上存放的全是地址。

代码示例
#include<stdio.h>

int main(){
    int num = 10;
    int * p;
    p = &num;

    // 双重指针
    int  ** q;

    // 指针变量也是变量的一种,即 p 也是有对应的地址
    // &p 即取 p 变量的地址
    q = &p;

    // p 变量存放的地址 ,即num变量的地址
    printf("p = %p\n",p);
    // p 变量自身的地址
    printf("p = %p\n",&p);
    // q 存放的地址就是 p 变量自身的地址
    printf("q = %p\n",q);
    // *p == num
    printf("*p = %d\n",*p);  
    // **q == *p == num
    printf("**q = %d\n",*p);

    return 0;
}

/*
    执行结果:
        p = 0x7ffee910c7c8
        p = 0x7ffee910c7c0
        q = 0x7ffee910c7c0
        *p = 10
        **q = 10
*/
图解
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值