【C语言】指针初阶-创新互联

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

创新互联建站是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:成都做网站、成都网站设计、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。

目录

文章目录

前言

一、回顾内存当中的那些事

内存中

变量数据在内存中是倒着存放的(不是数组)

二、指针及指针类型

1、指针类型的意义

解引用访问时(一次可以访问多大空间,多大权限)

指针加减一跳过字节数(had missed, so impressed)

2、指针类型的强制转换

3、野指针:没有明确指定地址的指针

4、指针运算

总结


前言

推荐一个新手也能上手的刷题网站:

LeetCode: https://leetcode-cn.com/problemset/all/


一、回顾内存当中的那些事 内存中

32位机器有32根地址线:

每根地址线都会发出两种的信号,共有 2的32次方 种可能

每一种可能表示一个内存单位的地址,位置

现在用 1 和 0 来信息化这些信号,并有序排列:

11111111 11111111 11111111 11111111

11111111 11111111 11111111 11111110

······

10000000 00000000 00000000 00000001

10000000 00000000 00000000 00000000

01111111 1111111 1111111 1111111

······

00000000 00000000 00000000 00000001

00000000 00000000 00000000 00000000

把信号相对应的编号赋给内存单位,这些二进制编号就成了内存单位的地址,也叫指针

(知道内存单位发出来的并不是真正的数字 1 / 0 ,而是两种不同的信号,人为规定的一种为 1, 一种为 0)

注:清楚指针指的是地址,是编号,指针变量指的是用来存放指针的变量,人们经常说用指针表示的是使用指针变量及与指针一些相关的东西

变量数据在内存中是倒着存放的(不是数组)

数组元素在内存中是地址从小到大有序存放的我们知道

但是变量的数据,在小端机器内存中都是倒着存放的<大小端问题>

字节为单位(字节内部不改动 不变顺序)

这些一定得了解

因为其倒着存放,所以通过低权限类型指针(如 char*类型指针)改变其局部内容时,是从数据末尾开始改变的(从上图的 44 开始改变)

<如果要先从 11 开始改变也可以,给指针先增加到末尾位置 然后减减倒序来改变>

二、指针及指针类型 1、指针类型的意义 解引用访问时(一次可以访问多大空间,多大权限)

指针类型决定解引用时,可以访问多大的空间:etc.

我们发现:当一种变量被不同类型的指针变量解引用时,可以达到改变该变量局部内容的效果

因此,我们可以灵活地定义不同类型的指针变量,灵活地来改变一个变量的内容

              这就是指针拥有类型的意义之一

为什么会有指针类型:为什么不专门定义一种类型作为指针的类型呢?答案显而易见

指针加减一跳过字节数(had missed, so impressed)

实际上是指针加减整数,跳过的字节数(题目只是易于回忆)

以 指针变量加 1 为例:

指针变量加 1 并不是单纯地地址加上 1(不是单纯地跳过一个字节)

指针变量加 1 ,跳过多少字节(地址加多少)取决于指针类型

etc.

如果是 int 类型指针,指针变量加 1 实际上地址加了 4 个字节

如果是 short 类型指针,指针变量加 1 实际上地址加了 2 个字节

如果是 char 类型指针,指针变量加 1 实际上地址也是加了 1 个字节

而指针变量加上其他整数,也是一样道理,可推算地址实际增加或减少了多少

这也是指针拥有类型的意义之一,所以指针拥有类型是很有必要的

2、指针类型的强制转换

首先要知道 &变量 时,取出来的地址带有类型,如 int a = 0; , 这里 &a 取出来的地址是带有类型的,为 int 类型的地址( int* )

地址(指针)放到与原来不同类型的指针变量中需要类型转换:

etc.

3、野指针:没有明确指定地址的指针

就如野狗一般,尽量少创造野狗哦

etc.

int* p;

*p = 2;

这样写地址为随机的值,解引用也不知道到哪去了(野狗创造论)

规避野指针:

NULL —— 专门用来初始化指针

int* p = NULL; //新的指针变量如果先不打算放地址就先赋上NULL,避免创造野狗

看到 NULL 相当于看到了指针,有那种感觉

4、指针运算

在数组中经常使用到指针

指针运算的几种类型:

指针加减整数

指针变量加 1 ,跳过多少字节(地址加多少)取决于指针类型,而加减整数按指针类型来推算即可

指针-指针(绝对值)

一般只能是指向同一块空间的两个指针相减,相加没必要(地址相加用不到),而不在同一块的指针相加减没什么意义

指向同一块地方的指针相减的意义:一般也是在数组中

指针相减结果为两指针之间的元素个数

如 arr [ ] 数组有十个元素,有人觉得其 首元素地址 减去 末元素地址 结果为十

不不不,实际结果应该为 9 ,原因是没有理解 地址有长度 和 指针指向的是地址始点

如下图,每个格子是arr的一个元素,箭头表示 指针指向的位置,是元素地址的开头而不是整个元素

指针的关系运算(比大小等等)

如 : p1 >&arr[1] (p1为指针变量)

但是唯一要注意的是:比较大小时,允许数组最后一个元素的后面的那一个内存单位(超出数组的内存单位范围)进行比较操作,如下图

但是数组第一个元素再前面的那一个内存单位(不属于数组的内存单位)不能进行比较的操作(如下图)

总的来说:要进行大小比较时,指针指向的范围在数组内(回忆看这里)


总结

以上就是今天要讲的内容,本文介绍了初级指针的概念和注意事项,易错点,而指针以后在数组中用途广泛,现在就得打好基础

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:【C语言】指针初阶-创新互联
新闻来源:http://hbruida.cn/article/dpodhi.html