【C生万物】 指针篇 (初级)上

简介: 【C生万物】 指针篇 (初级)

前言


370e28d82132798f78a90e533d2c4256_e6510fde102248338c249440750db93e.png

面对C语言,很多童鞋都会高呼:指针难,指针难,对于我来说,指针是解决问题的一大杀器,是C/C++的灵魂,先不考虑难不难的问题,上了车再说。


目录


Part1:何为指针


1.概念


2.编址和指针大小


Part2:指针使用


1.类型


2.解引用


Part3:野指针


1.概念


2.成因


2.1指针未初始化


2.2指针越界访问


2.3指针指向的空间释放


3.如何规避


Part4:指针运算


1.指针 +- 整数


2.指针 - 指针


3.指针的运算关系


Part5:指针与数组


Part6:指针数组


Part7:二级指针


正文


Part1:何为指针


1.概念


在初始C语言的时候就提到了,指针就是地址,具有指向作用。

这里有指针理解的两个要点:

• 指针是内存中一个最小单元的编号,也就是地址;

• 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。

总结一下,还是指针就是地址,口语中说的指针就是指针变量。

理解:

内存中的每个字节都是有标号的,称为地址:

6e9b27e2ba31f37cbc9c250c43cd935d_efa7c8746b0a402a97c4e2b5c731b43d.png

(地址以十六进制展示)

考考你,如何取到指针变量呢?

用取地址符号&,在操作符篇已经讲过了。

指针变量:

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

#include <stdio.h>
int main()
{
  int a = 10; // 在内存中开辟一块空间
  int* p = &a; // 使用&操作符,取出变量a的地址
  return 0;
}

a 变量占用4个字节的空间,这里是 将 a 的4个字节的第一个字节的地址存放在p变量中

p就是一个指针变量。


2.编址和指针大小


不知道你注意了吗,上方展示的是一个字节编一个地址,那么为什么这么做呢?

任何软件上的行为都可以归结到硬件上:

对于32位的机器,假设有32根地址线,

每根地址线在寻址的时候会产生高电压(1)或低电压(0),


32根地址线产生的地址就有:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

... ...

11111111 11111111 11111111 11111111

11111111 11111111 11111111 11111110

计算一下,这里有2^32个地址,

每个地址标识一个字节,就可以给4GB的空间进行编址。

(一位0/1为一个比特位,1Byte == 8bit)

• 在 32 位的机器上,地址是 32 个 0 或者 1 组成二进制序列,那地址就得用 4 个字节的空间来存储,所以一个指针变量的大小就应该是4 个字节。

• 在64 位机器上,如果有 64 个地址线,那一个指针变量的大小是 8 个字节,才能存放一个地址。

总结:

指针变量是用来存放地址的,地址是唯一表示一个内存单元的

指针的大小在32位平台是4个字节,在64位平台是8个字节


Part2:指针使用


1.类型


我们知道变量是有类型的,那么指针有类型吗?

答案是肯定的,

如:

38faae43965da865cc3a7a8732adccc4_a8c90d213f6d430f856d1e82a4b9712d.png

p 没有指定类型,所以会爆红。

正确情况应该是:

3b42c68b7ced8aea902ae613cae6297f_f356aea3b5c64b699f952f60369dbbcb.png

以下是一些常见的指针类型:

char* pc = NULL;
int* pi = NULL;
short* ps = NULL;
long* pl = NULL;
float* pf = NULL;
double* pd = NULL;

可见,指针的定义方式是 type + * + name

变量的类型与指针的类型是对应的

如 int* 指针存储 int 类型的变量,char* 指针存储 char 类型的变量。


2.解引用


指针的解引用符号也是 * ,是由地址找到变量的操作。

以上只是笼统的说法,实际上这种说法并不准确。

看下面这段代码:

83e03f3191ea9d9e5f73e463f7090d53_5c858217e921410386f4db88012fdea5.png

pc 和 pi 是不同的,区别在于访问的位数不同

char* 的指针解引用就只能访问一个字节,而int* 的指针的解引用就能访问四个字节。

准确的说法是:

指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。


Part3:野指针


1.概念


野指针就像一条野狗,它面向的位置是随机的

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。


目录
相关文章
C生万物 | 从浅入深理解指针【最后部分】(二)
C生万物 | 从浅入深理解指针【最后部分】(二)
|
6月前
|
存储 C++
C生万物 | 从浅入深理解指针【第三部分】(转移表的实现)
C生万物 | 从浅入深理解指针【第三部分】(转移表的实现)
C生万物 | 从浅入深理解指针【第二部分】(二)
C生万物 | 从浅入深理解指针【第二部分】(二)
|
6月前
|
编译器
C生万物 | 从浅入深理解指针【第二部分】(一)
C生万物 | 从浅入深理解指针【第二部分】 前言: 如果没有看过第一部分的话,推荐先看第一部分,然后再来看第二部分~~
|
6月前
|
存储 C语言 C++
C生万物 | 从浅入深理解指针【第一部分】(一)
C生万物 | 从浅入深理解指针【第一部分】
|
6月前
|
机器学习/深度学习 安全 程序员
C生万物 | 从浅入深理解指针【第一部分】(二)
C生万物 | 从浅入深理解指针【第一部分】(二)
|
6月前
|
C语言 C++
C生万物 | 从浅入深理解指针【最后部分】(一)
C生万物 | 从浅入深理解指针【最后部分】(一)
C生万物 | 从浅入深理解指针【第四部分】(qsort的使用和模拟实现)
C生万物 | 从浅入深理解指针【第四部分】(qsort的使用和模拟实现)
|
11月前
|
存储 编译器 C语言
C生万物 | 指针进阶 · 炼狱篇-3
C生万物 | 指针进阶 · 炼狱篇
67 0
|
11月前
C生万物 | 指针进阶 · 炼狱篇-2
C生万物 | 指针进阶 · 炼狱篇
49 0