这是c语言的重中之重,对于许多数据结构与算法的实现,后续的结构体和数组,联合体这些都与指针有关,所以也希望大家能重视起来,这篇文章只是让大家已最简单的方式了解指针,后续对指针的详细介绍会在后续文章中写出(作者又在给自己挖坑了,而且不知道什么时候填坑)

内存

想了解指针,应该先了解内存。

内存是计算机的存储器,这里扩展一下计算机的大概组成

计算机组成:控制器,运算器,储存器,输入设备,输出设备

计算机所有程序的运行都是在内存中的,所以内存在计算机也是尤为重要。

当我们有一台电脑后都会有相应的内存,比如说我用的

是16G的内存,但是内存这么大,计算机又是怎样使用的呢?

在使用前,计算机会把计算机的内存分为一个个小块,并且每一块给他取了一个名字,在使用的时候直接对接名字即可。用一个实际生活的例子来举例,每次你点外卖时,都会把自己的地址信息提供给外卖平台,这样外卖员在给你送外卖时得知了你是xxx区xxx学校的,这样就可以迅速的把外卖送到。

用图来解释应该是这样

一整个内存被分配成很多个空间

这样就派生出来两个问题

*1、内存是如何编号的

*2、一个这样的内存单元站多大空间

这里还需要简单介绍一下计算机

在我们讨论计算机的时候应该有聊过32位和64位吧(当然现在应该都是64位的计算机了)

64位就代表了物理上有64根地址线,在计算机通电后会产生正负点,这样就产生了计算机的二进制位(电信号转化为数字信号),正点为1,负电为0

因为现在是为了让大家理解,,而且大家使用大多数编译器都是32位的(除去新的vs2022),所以就以32位来介绍

这样产生的32个二进制位就产生了从00000000000000000000000000000000~1111111111111111111111111111111111111111个数字

这些序列都作为内存的编号,当编号作为内从空间的代表时,我们就称作这些编号为捏村单元的地址。这样编写,我们的计算机就能管理2^32个内存单元,假设一个内存单元是一个bit位那么总共有4294967296个bit位

这个数字/8就代表了总共能管理的字节数

再/1024

算出来应该是kb

再/1024

算出来是512MB

再/1024,就是0.5GB

现在我们来看,这个内存算是非常小的了,所以一般计算机的内存分配也不会是这样分配的。

大家知道c语言最小的变量char类型占一个字节,一个字节就是8bit,那样就是8个地址,所以最终经过平衡后一个内存单元占一个byte(字节),用于分配地址

接下来就要正式的聊到指针了

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int a = 1;return 0;
}

这样的一段代码,计算机就给a这个变量分配了四个字节的空间

接下来介绍一下查看a这个变量的地址,这里我们需要用到&,这是一个取地址符号,用于得到变量地址和%p作为输出

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int a = 1;printf("%p", &a);return 0;
}

得到的地址就是这个,但是&只会拿到这个变量第一个字节的地址,但是当我们需要存放这个地址的时候我们就需要一个变量去储存,这在c语言中就叫指针变量,a这个变量是int型,指向a的这个指针变量的类型位int*,&用于取出变量的直至

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int a = 1;int* A = a;printf("%p", &a);return 0;
}

这个*代表了A是一个指针变量,Int代表了这个指针所指向的变量的类型是Int型

当然我们可以举一反三

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {char a = 'A';char pa = &a;return 0;
}

现在我来教大家如何使用这个指针

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int a = 1;int* A = a;printf("%p", &a);return 0;
}

A这个指针是指向a所在的内存空间,如果我们想使用的时候应该这样

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int a = 1;int* A = a;*A = 10;//第三行printf("%d", *A);return 0;
}

第三行这个*代表的就是解引用操作,就是通过a的地址来找到a所在的内存空间,这里可以跑一下程序验证一下,这里我通过指针将a的值改为了10

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int a = 1;int* A = &a;*A = 10;printf("%d", a);return 0;
}

这里已经证明更改成功了

再来看一下最后一点指针类型的大小

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {int* a = NULL;char* b = NULL;printf("a的大小为%d", sizeof(a));printf("b的大小为%d", sizeof(b));return 0;
}

这里NULL代表了空指针,也就是不指向任何内存的一个指针,这样我们可以使用sizeof来计算一下空指针的大小

同理,其实实际上所有指针的大小都是相同的,都是四个字节,这是因为32位的编译器指针大小的是32个bit,所以计算出来是4byte.

C语言的精华——指针 指针初识相关推荐

  1. 初识C语言:了解基础指针

    前言:相信大家都有被指针的大名吓到过,但是不用怕.今天我来带大家了解一下基础的指针. 提前说明一下:这只是简单了解一下(这篇后我们的初识C语言部分便结束了) 下篇我们将详细的讲解分支和循环语句 一.指 ...

  2. c语言 指针_初识C语言指针

    一切皆为地址 C语言用变量来存储数据,用函数来定义一段功能代码,它们最终都要放到内存中供 CPU 调用. 数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存存储的是数据还是代码.当 ...

  3. 【鹏哥C语言网课笔记】初识指针

    目录 一.指针是什么? 二.指针和指针类型 三.野指针 指针未初始化 指针越界 指针指向的空间释放 如何规避野指针 四.指针运算 指针+-整数 指针-指针 指针的关系运算 五.指针和数组 六.二级指针 ...

  4. 【C指针】初识指针,轻松了解指针

    ⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言初阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...

  5. c语言如何用指针操作一维字符数组,C语言中数组和指针的互操作

    C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减.当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有 ...

  6. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

    C语言:一个涉及指针函数返回值与printf乱码.内存堆栈的经典案例 一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中 ...

  7. C 语言编程 — 高级数据类型 — 指针

    目录 文章目录 目录 前文列表 指针 声明一个指针变量 使用指针 空指针 悬空指针 野指针 指针的算术运算 指向指针的指针 将指针作为实际参数传入函数 从函数返回指针 一个古老的笑话 前文列表 < ...

  8. C语言精要总结-指针系列(二)

    此文为指针系列第二篇: C语言精要总结-指针系列(一) C语言精要总结-指针系列(二) 指针运算 前面提到过指针的解引用运算,除此之外,指针还能进行部分算数运算.关系运算 指针能进行的有意义的算术运算 ...

  9. C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt

    C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...

最新文章

  1. kubernetes 配置kubedns
  2. DL之CNN优化技术:学习卷积神经网络CNN的优化、实践经验(练习调参)、从代码深刻认知CNN架构之练习技巧
  3. 通过计算TCO体现固态盘的真正价值
  4. 7-37 组个最小数 (20分)_波音737高度计上蹊跷的“8英尺”,09年土耳其航空1951号航班空难...
  5. suse linux 分区表格式
  6. java中web错误返回码,Java-Web3j Transfer.sendFunds()返回错误“天然气...
  7. 西门子系列PLC教学视频资源4——S7-1200
  8. c语言sobel边缘检测,Sobel边缘检测的FPGA实现
  9. 2021年全球探针卡市场规模大约为158亿元(人民币),预计2028年将达到247亿元
  10. Tecplot 输入数学符号
  11. JavaScript 详细笔记(狂神说学习笔记)
  12. 招聘人员最喜欢问的问题有哪些
  13. 数据的力量 驰援疫情丨对抗新型肺炎,志愿者招募
  14. 网页回拨-Web CallBack
  15. Android 应用清单简介1
  16. Floorplan基本概念合集
  17. Eight II HDU - 3567
  18. 单机java_java实现单机版五子棋小游戏
  19. 10个精致的企业网站设计模板欣赏及点评
  20. RK3399平台开发系列讲解(SPI子系统)4.16、SPI子系统之spidev驱动分析

热门文章

  1. 手把手教你学AltiumDesigner之新建元件封装库
  2. 在GitHub中搜索的技巧
  3. CPSR SPSR
  4. java 面试知识点笔记(七)多线程与并发 上篇
  5. 2022中国开发者影响力盛典暨CSDN企业生态汇在京举行
  6. 转载:各个手机尺寸版本
  7. JAVA多线程读写文件如何做到线程安全?(文件锁,FileChannel)
  8. 什么叫组网_什么叫MESH组网
  9. 软件测试自学毛笔字纹身,横眉冷对千夫指 俯首甘为孺子牛的毛笔楷书和行书...
  10. 金田一少年の怪奇事件部