当前位置: 首页 > article >正文

【C语言】指针基础知识(一)

af3be47e1d3f4ecb9d2eddbe236b0e45.png

计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。

一,内存和地址

内存被分为一个个单元,一个内存单元的大小是一个字节。

内存单元的编号(可以理解为门牌号) == 地址 == 指针
 
编址:如何找内存空间(找门牌号)
 

56ed76c333844401a7371cc18765d943.png

控制总线:发信息———要读取目标信息

地址总线:拿信息———拿取到目标信息

数据总线:传信息———从内存向CPU传信息

二,指针变量和地址

1,简单理解:

int main()
{
    int a = 0;

    return 0;
}

表层意思:创建一个变量a,并赋值为10。

深层意思:在内存上申请4个内存的空间,存放10。

2,取地址:

int main()
{
    int a = 10;
    printf("%p", &a);

    return 0;
}

运行结果:

d0104b6abd5d4abcb0346306f04667a6.png

一个整型的大小为四个字节,每个字节都有它所对应的地址。但是打印整型地址时并不是四个字节都打印,而是只打印四个地址里的第一个地址(地址较小的那个)。

3,指针变量:

地址可以用指针变量存放起来。也就是说,指针可以用指针变量存放起来。
int *pa=&a;
pa为指针变量,int*为变量的类型。
注意!!!我们口头所说的指针一般是指针变量。
通过地址可以找到a,也可以说是pa指向了a的起始位置。
2321b7afe3d948d895325f5b92b3a277.png
int*中的int和*分别代表什么?
 
*      说明pa是指针变量的意思
int    说明pa指向的对象的类型是int类型

4,解引用操作符

地址有了,该怎么用?也就是说,有了变量(pa),该怎么用?

这样用:

int main()
{
    int a = 10;
    printf("%p\n", &a);
    int* pa = &a;
    *pa = 20;

    return 0;
}

*pa为解引用操作符,意思是:通过pa里面的地址找到它所指向的值,也就是a。也就是说,*pa就是a。

代码中*pa=20的意思就是a=20。

5,指针变量的大小

指针变量是专门来存放地址的,无论是什么,只要在指针变量里,它都是地址。

指针变量的大小有多大?取决于一个地址的存放需要多大的空间。

验证:

#include<stdio.h>
int main()
{
    char* a = NULL;
    int*  b = NULL;
    printf("%zd\n", sizeof(a));
    printf("%zd\n", sizeof(b));
    return 0;
}

运行结果:

29a2e3e52f59450bb81406d2632bf5b0.png

注:X86是32位机器,X64是64位机器

 

32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
注:不同环境会带来不同的影响,例如:指针变量大小的区别
 
 

 

 


http://www.kler.cn/a/272254.html

相关文章:

  • T-SQL语言的数据库编程
  • Matlab自学笔记四十五:日期时间型和字符、字符串以及double型的相互转换方法
  • 代码随想录刷题day13|(链表篇)24.两两交换链表中的结点
  • PyTorch使用教程(13)-一文搞定模型的可视化和训练过程监控
  • BottomNavigationBar组件的用法
  • 前端开发Web
  • 深度强化学习01
  • ubuntu18.04安装ffmpeg
  • OGRE Pittfals Design proposal for Ogre 2.0
  • Day67:WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网
  • 代码随想录Day48:买卖股票的最佳时机、买卖股票的最佳时机II
  • 前端基础篇-深入了解 JavaScript(JSON、BOM、DOM 和事件监听)
  • C#学习路线指南
  • 云原生部署手册02:将本地应用部署至k8s集群
  • 数值分析复习:Newton插值
  • C/C++蓝桥杯之报数游戏
  • ASP.NET 服务器控件
  • Docker 安装 Skywalking以及UI界面
  • 数据库MySQL
  • 双向链表的实现
  • 小心串行队列的执行依赖
  • Vue2 引入使用ElementUI详解
  • python --阿里云(智能媒体管理/视频点播)
  • CI/CD实战-gitlab代码仓库 2
  • Git入门学习
  • 最后的挣扎 - Qt For Android on HuaWei Mate 60Pro (v4.0.0)