C语言指针初识——原来指针这么有趣

举报
布小禅 发表于 2021/09/24 21:25:21 2021/09/24
【摘要】 C语言指针初识——原来指针这么有趣

1. 普通指针

什么是普通指针,普通指针就是指向基本数据类型的指针,比如int 、float等。

1.1 指针的定义

我认为实战是最好的理解方式,所以会有代码以及注释详细理解,不过在你看代码之前,你应该知道这些东西:

  1. 如何定义一个指针
  2. 如何给指针赋值
  3. 给指针赋值后,怎么使用原变量的值

就和定义一个普通变量一样:类型 *变量名

指针变量接收的是变量的内存地址在C语言中,通过符号&来取出变量的内存地址

赋值也是同样的


1.2 指针实例理解

那么你知道了这些知识后,就看代码:

#include<stdio.h>
​
int main()
{
    int num = 10;
    // 创建一个int类型的变量,并赋值为10
    int* pnum;
    // 创建一个int类型的指针,你还能这样写 int *pnum
    pnum = &num;
    // &num是num在内存空间的内存地址
    // 这句代码是将num的内存地址赋值给pnum
    printf("num的值为:%d\n&num的值为:%p\n*pnum的值为:%d\npnum的值为:%p",num,&num,*pnum,pnum);
    // 将各个值都打印出来看看效果
    return 0;
}

运行结果是:

num的值为:10
&num的值为:0xff8effe0
*pnum的值为:10
pnum的值为:0xff8effe0

1.3 头脑风暴

看了这段代码,是不是对指针有了更深刻的了解了呢?

如果你想学好,就暂停你的进度,思考一下:

  • pnum是什么,他开辟的内存空间是多大
  • *pnum是什么,有什么用
  • &pnum是什么,他的作用是什么

思考之后来看看吧~~

那么我们看着代码和运行结果可以总结出以下内容:

接下来,你就想想,你的身份证号,你的身份证,国家信息系统

  1. num是一个变量,这个变量可以对10进行操作

    • 将10当成你,num是你的名字
    • 声明一个变量后,内存空间会为变量开辟一个内存空间以及内存地址
    • 而你出生后也会有一个身份证号
  2. &num是变量的内存地址,这里&num虽然是内存地址,但是不说&num是num的指针,因为指针是一个变量,俗称指针变量

    • num在内存的内存地址相当于你的身份证号
    • 你的身份证号只是一串数组,抽象存在
  3. pnun是一个指针变量,他的值是是&num,也就是一个普通变量的内存地址

    • 把它当成你的身份证
    • 你的身份账号在上面,就可以通过身份证号(指针)进行操作(买票,办卡等)
  4. *pnum是通过内存地址获取到该内存地址存储的值

    • 就是通过你的身份证在国家系统找到了你
    • 也可以对你进行操作(比如征信,车票等)

1.4 头脑风暴(二)

试想,你如果声明一个变量,并将该指针变量的内存地址给该指针,也就是让指针变量存储的是指针的内存空间,会有什么事情发生?

思考:我们的指针变量是一个存储内存地址的指针,但他同样也还是一个变量,所以也会在内存中有自己的内存地址,而刚好指针存储的就是变量!!等等等等,一拍即合,我们就把指针的内存赋给指针,看看会发生什么!

上代码:

#include <stdio.h>
​
int main(int argc, char const *argv[])
{
    int * p;
    p = &p;
    printf("p=%p\n&p=%p\n*p=%p",p,&p,*p);
    return 0;
}
​

编译结果:

p=0xfff75af4
&p=0xfff75afc
*p=0x0

哦豁,结果清晰可见,我们也因此产生了一些疑惑,为什么会出现两个内存地址呢?

来看看昨晚我与大佬的对话吧~~

在这里插入图片描述在这里插入图片描述

但是当时还是很疑惑为什么会出现了两个内存地址~~

第二天找到了原因!

昨天是使用手机敲得C代码,因为那时候还在火车上,没法拿电脑

今天使用了电脑,编译器是gcc,编辑器是vs code

重新编译了一下

运行结果如下:

p=0061FECC
&p=0061FECC
*p=0061FECC

欸,这就很舒服了,内存地址是一样的,所以虽然安卓有C语言的编译器,但还是使用电脑吧。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。