【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

news2024/10/5 18:29:29

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


Hello,这里是君兮_,最近刚回家有点懒,从今天开始恢复更新并开始更新新的刷题系列,我们先继续更新0基础入门C语言的内容,今天给大家带来的是指针方面的内容,但由于是初阶,一些高级的用法我们放在进阶篇再讲,今天只讲基础

  • 废话不多说咱们直接开始吧!!

    指针详解

    • 一.指针是什么?
      • 内存与指针变量
    • 二.指针和指针类型
      • 指针+-整数
      • 指针变量的大小
      • 指针的解引用
    • 总结

一.指针是什么?

  • 对于初学者来说,最容易弄混的就是指针的含义,导致错误的应用,因此我们今天先来讲讲指针是什么。

指针理解的2个要点:
1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中我们说的指针,通常指的是指针变量,是用来存放内存地址的变量

  • 总结:指针就是地址,口语中说的指针通常指的是指针变量。

内存与指针变量

  • 内存
    在这里插入图片描述
  • 指针变量

我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个变量就是我们的指针变量

#include <stdio.h>
int main()
{
    int a = 10;//在内存中开辟一块空间
    int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
    //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个之指针变量。
    return 0;
}
  • 总结:
  • 指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
  • 那这里的问题是:
  • 一个小的单元到底是多大?(1个字节)
  • 又如何编址?
  • 经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。
  • 对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
    那么32根地址线产生的地址就会是:
    在这里插入图片描述
  • 64位机器同理,有64位地址线,这里仅以32位机器为例。
  • 二进制,由于有32根地址线,所以一共有2的32次方个字节的空间,也就产生了这么多的编号。
    在这里插入图片描述
  • 我们知道(2^32Byte = 2^32/1024KB =2^32/1024/1024MB = 2 ^32/1024/1024/1024GB = 4GB)
  • 此时我们就能给4GB的空间进行编址。
  • 这里我们就明白:
  • 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
  • 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

总结:
指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
指针的大小在32位平台是4个字节,在64位平台是8个字节


二.指针和指针类型

  • 与变量相同,指针也有不同的类型。
int *p;     //定义一个指针变量P,指向整形变量 
char *p;		// 定义一个指针变量p,指向字符型变量 
float * p; 		// 定义一个指针变量p,指向单精度浮点型变量 
double *p1, *p2;		//定义两个指针变量p1和p2,指向双精度实型变量 
  • 这里可以看到,指针的定义方式是: type + * 。(type指类型名)

指针±整数

  • 我们来看一下代码:
#include <stdio.h>
//演示实例
int main()
{
    int n = 10;
    char* pc = (char*)&n;
    int* pi = &n;
    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    return 0;
}

在这里插入图片描述

  • 这里的%p是打印地址的意思。
  • 1.我们从打印结果可以看出&n与pc的地址是相同的,也就是说两者指向同一处。(这里由于n是int类型,我们需要将它强制类型转换成char类型再使用)
  • 2.由2和3我们可以看出指针加1也就是地址加1即地址指向朝后的一位。
    - 3.从3,4,5我们可以看出,不同类型的指针加1朝后跨越的地址是不同的,与指针变量的类型有关。
  • 总结:指针的类型决定了指针向前或者向后走一步有多大(距离)
  • 但是,这里我们要知道,在相同的操作系统下,指针变量的大小都是相同的!

指针变量的大小

  • 上面我们讲了指针在内存中存放的方式以及存储的空间大小,空间有多大自然就有多大的地址,也就是有多大的指针。
  • 用代码测试一下:
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
  printf("%d\n", sizeof(char *));
  printf("%d\n", sizeof(short *));
  printf("%d\n", sizeof(int *));
  printf("%d\n", sizeof(double *));
  return 0;
}

在这里插入图片描述

  • 我的电脑是64位平台,因此指针的大小为8个字节

总结:
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)

指针的解引用

#include <stdio.h>
int main()
{
    int n = 0x11223344;
    
    int* pi = &n;
    *pi = 0;
   char* pc = (char*)&n;
   *pc = 0;
    return 0;
}

在这里插入图片描述

  • 以上是pi在内存中的存储,当我们把pi中的值改为0后
    在这里插入图片描述
  • 4个字节中存放的数据全部被改为0
    在这里插入图片描述
  • 以上是pc在内存中的地址,我们可以看到当也把地址中的数据改为0后,却只改了一位字节的地址.
  • 总结:
  • 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
  • 比如: char * 的指针解引用就只能访问一个字节,而 int * 的指针的解引用就能访问四个字节。

总结

  • 今天的内容暂时到这里就结束了,我们今天先讲了指针的定义,类型,大小,以及不同类型的指针的不同之处,剩下的部分我们分批次后续进行讲解

  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MYSQL基础】MYSQL用户管理

MYSQL用户管理 数据库的root用户拥有操作数据库的所有权限&#xff0c;如果要团队协作开发&#xff0c;为了避免有成员误操作&#xff0c;可以给成员创建一个权限较低的用户账号 创建用户 create user 用户名 identified by ‘密码’; mysql> create user dam identified …

数据劫持大揭秘:Vue的隐形力量和无限可能

文章目录 1. 初始化阶段2. 响应式侦测器3. 数据劫持4. 模板编译5.总结 Vue.js 通过数据劫持实现了数据的双向绑定。它使用了一个名为 “响应式系统” 的机制来追踪和响应数据的变化&#xff0c;从而自动更新相关的视图。 Vue 的数据劫持原理主要分为以下几个步骤&#xff1a; …

main函数和其他函数

##什么是main函数函数就很敏感&#xff0c;在我认为的函数函数就是功能 有系统给的也有自己写的 函数就是一个封装好的功能 function 函数&#xff0c;功能。main函数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9a92f39cf6a842f5a56dbc1689012ceb.png 函数的参数&am…

高压放大器工作原理以及参数介绍

高压放大器是一种电子器件&#xff0c;其主要作用是将输入信号的电压放大到输出端。由于高压放大器的输入和输出端的电平差很大&#xff0c;因此需要使用特殊的材料和技术来保证电路的可靠性和稳定性。下面我们就来详细介绍一下高压放大器的工作原理和参数介绍。 图&#xff1a…

推荐4款好用的在线作图软件,可一键安装

本文将介绍4个功能强大又可以免费使用的在线作图软件&#xff0c;可以帮助设计师更快地完成绘图工作&#xff0c;一起来看看吧&#xff01; 1.即时设计 即时设计是一款功能强大的在线作图软件&#xff0c;它提供了丰富的绘图工具、层管理和样式库&#xff0c;让设计师可以轻松…

集群 第二章

目录 1.DR 模式 LVS 负载均衡群集部署 2.总结 1.DR 模式 LVS 负载均衡群集部署 DR 服务器&#xff1a; 192.168.83.104 NFS服务器&#xff1a; 192.168.83.103 Web 服务器1&#xff1a; 192.168.83.102 Web 服务器2&#xff1a; 192.168.83.101 …

(八)解析函数的无穷可微性与 Cauchy 型积分定理

本文主要内容包括&#xff1a; 1. 解析函数的无穷可微性1.1. 解析函数的高阶导数1.2. 导数估计式 —— Cauchy 不等式1.3. Liouville 定理1.4. 代数基本定理的一种证明 2. Cauchy 型积分定理2.1. Cauchy 型积分2.2. Cauchy 型积分定理 1. 解析函数的无穷可微性 1.1. 解析函数的…

状态检测防火墙

状态检测防火墙原理 对于已经存在会话表的报文的检测过程比没有会话表的报文要短很多。通过对一条连接的首包进行检测并建立会话后,该条连接的绝大部分报文都不再需要重新检测。这就是状态检测防火墙的“状态检测机制”,相对于包过滤防火墙的“逐包检测机制”的改进之处。这种…

黑马点评(达人探店)

达人探店 一、发布探店笔记 发布探店笔记功能是项目本身就完成了的功能&#xff0c;他会把图片存在本地&#xff0c;有兴趣可以去看源码&#xff0c;在UploadCOntroller类下 二、查看探店笔记 这个功能项目本身是没有完成这个接口的&#xff0c;所以需要我们自己去完成。 …

点击echart图即可获取对应代码的网址

PPChart - 让图表更简单 点击第一个数据中心即可获取对应的代码

在XAMPP环境中搭建wordpress网站教程

1、在xampp的安装目录中找到htdocs文件夹&#xff0c;在此文件夹中建立新文件夹&#xff0c;作本地网站要目录&#xff0c;如&#xff0c;wp-jianzhanpress。 2、将解压后的wordpress程序&#xff0c;放到该目录下。 3、启动XAMPP程序&#xff0c;点击“admin”。进入数据库管理…

Centos 7 下安装Redis

官网地址&#xff08;英文&#xff09;&#xff1a;Redis 官网地址&#xff08;中文&#xff09;&#xff1a;CRUG网站 or redis中文文档 Redis源码地址&#xff1a;GitHub - redis/redis: Redis is an in-memory database that persists on disk. The data model is key-v…

媲美postman?这款国产测试工具你知道吗

没有测试数据的用例就像一盘散沙&#xff0c;跑两步就跑不动了 没有测试数据&#xff0c;所谓的功能测试和性能测试全都是无米之炊。但我发现一个蛮诡异的事情&#xff0c;就是行业内很少会有人去强调测试数据的重要性&#xff0c;甚至市面上都没有人在做测试数据这门生意。 …

JMeter笔记(二)

个人学习笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 目录 一&#xff1a;了解常用组件 二&#xff1a;创建测试计划 1&#xff09;先新建一个测试计划 2&…

了解三维展厅模型从这里开始

引言&#xff1a; 随着科技的不断进步&#xff0c;展览方式也在不断演变。在这个数字化时代&#xff0c;三维展厅模型正成为展览领域的新宠。三维展厅模型通过结合计算机图形技术和虚拟现实技术&#xff0c;为观众带来身临其境的展览体验。 一&#xff0e;三维展厅模型的定义与…

ARM day7 (串口协议)

实验一 键盘输入一个字符a,串口工具显示b uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h"//初始化UART4 void hal_uart4_init();//发送一个字符 v…

MBD开发 STM32 CAN

Matlab/Simulink之STM32开发-CAN接收 - 知乎 Matlab/Simulink之STM32开发-CAN发送 - 知乎 目录 can发送 can接收 can发送 一直报这个错误&#xff0c;不用管 手动指定信号 can接收 CAN通讯中断选择&#xff1a;USB low priority or CAN RX0 interrupts CAN报文的接收模型主…

Mysql-事务及索引

事务 概述 用来统一sql语句的操作 防止删了这种情况的发生 删了部门&#xff0c;但是删员工的出错了没删成 事务中的语句要么全部都运行成功&#xff0c;要么全部都不运行成功 且可以撤销事务的操作&#xff1a;叫事务回滚 介绍 正常不开启事务 就每一条语句都是一个事务 …

安装jupyter notebook及插件

pip命令 pip install jupyter notebook 安装插件的pip pip install jupyter_nbextensions_configurator pip install jupyter_contrib_nbextensions jupyter nbextensions_configurator enable --user jupyter contrib nbextension install --user 输入jupyter notebook &…

vue 递归

目录 1. 树结构递归效果图 2. 代码&#xff1a; 1. 树结构递归效果图 ps &#xff1a;递归说白了就是自己掉自己。 2. 代码&#xff1a; //1. 调查询表格的接口_this.$API.departmentGetTreeList().then((res) > {if (res.data.code 200) {this.loading false;let temp…