前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言指针初识——原来指针这么有趣

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

作者头像
玖柒的小窝
修改2021-09-26 09:17:51
3200
修改2021-09-26 09:17:51
举报
文章被收录于专栏:各类技术文章~各类技术文章~

1. 普通指针

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

1.1 指针的定义

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

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

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

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

赋值也是同样的


1.2 指针实例理解

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

代码语言:javascript
复制
#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;
}

运行结果是:

代码语言:javascript
复制
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 头脑风暴(二)

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

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

上代码:

代码语言:javascript
复制
#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;
}
​

编译结果:

代码语言:javascript
复制
p=0xfff75af4
&p=0xfff75afc
*p=0x0

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

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

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

在这里插入图片描述

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

第二天找到了原因!

❝昨天是使用手机敲得C代码,因为那时候还在火车上,没法拿电脑 今天使用了电脑,编译器是gcc,编辑器是vs code 重新编译了一下 ❞

运行结果如下:

代码语言:javascript
复制
p=0061FECC
&p=0061FECC
*p=0061FECC

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 普通指针
    • 1.1 指针的定义
      • 1.2 指针实例理解
        • 1.3 头脑风暴
          • 1.4 头脑风暴(二)
          相关产品与服务
          对象存储
          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档