【C语言初阶】初学必看,深入了解指针的概念!看完让你不在害怕指针(图文并茂)

简介: 【C语言初阶】初学必看,深入了解指针的概念!看完让你不在害怕指针(图文并茂)

📋 前言

   🌈hello! 各位宝子们大家好啊,今天给大家带来的指针篇的初阶,带你先从底层一步步理解指针!

   ⛳️指针可以说是C语言最重要的部分了!俗话说,函数是C语言的核心,那么指针可以说就是咱们程序的灵魂了。
   📑不过不用但心读完这篇文章你就会发现指针也是那么回事,一学就懂!

   📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐

  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 什么是指针?

  ⛳️大家都知道我们计算机存储东西都是存储在内存,或者存储在硬盘里面。那么我们该如何管理我们的内存呢?这时就有人说那么我们把内存划分位一个个的字节,然后每个字节给上编号。这样是不是就容易管理我们的内存了!

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

⛳️ 那么我们用什么来管理地址的呢?这时指针就被发明出现了,指针用于专门存放我们的地址来的。

  • 存放可以改变的数据叫变量,那么存放地址的叫什么?
  • 指针是用来存放内存地址的变量,所以我们叫他指针变量。

大家都知道我们变量的创建和数组创建都是在内存中开辟了一块空间,那么就肯定有地址。如果那想把变量或数组的取出来就需要 & 取地址操作符!

📚 代码演示:

#include <stdio.h>
int main()
{
  int a = 100;
  int * pa = &a;//pa是专门用来存放地址(指针)的,
  char* pc = &a;//这里的pa就被称为指针变量
  return 0;
}

总结:

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

💭 指针的大小

地址的编号是怎么产生的:

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);

  • 那么32根地址线产生的地址就会是:

每个地址标识一个字节,那我们就可以给

(2^32Byte == 2^32/1024KB ==232/1024/1024MB==232/1024/1024/1024GB == 4GB)

4G的空间进行编址。同样的方法,那64位机器,如果给64根地址线,那能编址多大空间,自己计算。

⛳️这时我们就会知道

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

📑 总结:

  • 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
  • 指针的大小在32位平台是4个字节,在64位平台是8个字节
  • 我们也可以验证来看看!

📚 代码演示:

#include <stdio.h>
int main()
{
  printf("%d\n", sizeof(char*));
  printf("%d\n", sizeof(short*));
  printf("%d\n", sizeof(int*));
  printf("%d\n", sizeof(long*));
  printf("%d\n", sizeof(float *));
  printf("%d\n", sizeof(double*));
  return 0;
}

📑 代码结果:

💭 指针类型的意义

  ⛳️诶这时就会有铁汁们问了,既然指针的大小都是一样的那么指针有类型嘛?答案是有的指针也有各种各样的类型。

#include <stdio.h>
int main()
{
  char* pc = NULL;
  int* pi = NULL;
  short* ps = NULL;
  long* pl = NULL;
  float* pf = NULL;
  double* pd = NULL;
  return 0;
}

这里可以看到,指针的定义方式是: type + **说明了我们是指针变量

其实:

  • char* 类型的指针是为了存放 char 类型变量的地址。
  • short* 类型的指针是为了存放 short 类型变量的地址。
  • int* 类型的指针是为了存放 int 类型变量的地址

⛳️ 而这又有人会问了,指针的大小都是一样那么指针要这么多地址干嘛呢?

  • 其实指针的类型是为了解引用而设计
  • int 类型的解引用,就会访问4个字节
  • 而char 类型 解引用就只能访问一个字节

📚 代码演示:

🔥 总结:指针类型可以决定指针解引用的时候访问多少个字节(指针的权限)。

📖 指针的加减

  ⛳️ 前面讲了指针的类型决定了我们解引用的时候访问多少字节,而指针的类型还有一个作用!

  • 指针类型决定了指针 加或减 操作时的步长
  • 整形指针 +1 跳过4个字节
  • 字符指针 +1 跳过1个字节
  • 而其他指针也同理,下面我们就来验证一下

📚 代码演示:

这里大家就能看到对于不同类型的指针,我们进行加减所能操作的步长时有关系的!

  • 对于 type * p的指针想要加 nn 是这样计算的
  • n*sizeof(type)

那么这么的用处是什么?假设我们有一串字符 "abcdef/n ” 如果指针指向第一个元素,那么就只能跳过一个字节访问b

  • 但如果用int 类型的指针进行计算就会跳过4个字节
  • 指向字符 e 了,所以整形指针就应该存放 整形变量的地址
  • 这样才是最合理的。

🔥 总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。

💬 野指针

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

📖 野指针成因

📝1. 指针未初始化

局部变量指针未初始化,默认为随机值。所以它指向了一个不可预料的地址,当我们使用这个指针进行赋值时就会出现问题!

  • 你连指针指向哪里都不知道,结果你想用这个地址赋值!
  • 万一更改了程序配置呢? 这肯定是不允许的!
#include <stdio.h>
int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
 return 0;
}

📝 2. 指针越界访问

这里明明我们数组只有10个元素,但是使用指针缺访问了却跳过了11个元素。

  • 访问了不属于它管理的地址,就是指针越界了
#include <stdio.h>
int main()
{
    int arr[10] = {0};
    int *p = arr;
    int i = 0;
    for(i=0; i<=11; i++)
   {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
   }
    return 0;
}

📝 3. 指针指向的空间释放

⛳️ 大家可以看一下下面这段代码,变量 a 属于栈区上的空间,所以test函数结束时在其内部创建的变量就会销毁,还给操作系统。

  • 那么这里p 所接收的地址就是一个野指针不确定的。
  • 所以我们打印出来的也是随机值。

🔥 注:C/C++的内存分别我们在这里有明确讲解,比如说栈空间是干嘛的?大家可以去了解了解《C/C++的内存分布》

📚 代码演示:

#include <stdio.h>((
int*  test()
{
  int a = 110;
  return &a;
}
int main()
{
  int* p = test();
  printf("");
  printf("%d\n",*p);
  return 0;
}

📑 代码结果:

💬 如何规避野指针

1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放,及时置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

这些就是我们需要注意的点了,对于指针一定要避免成为空指针。释放完不用是要及时置为空。

  • 下面就为大家演示一下

📚 代码演示:

#include <stdio.h>
int main()
{
    int *p = NULL;//p是一个空指针,没有指向任何有效空间。   
    int a = 10;  //这个指针不能指针使用
    p = &a;
    if(p != NULL)
   {
        *p = 20;
   }
    return 0;
}

📝全篇总结

✅ 归纳:

好了以上就是关于什么是 指针和指针的注意事项就给大家讲解清楚了!有不会可以评论留言或私信博主呢!

  什么是指针

  指针类型的意义

  野指针成因

  如何避免野指针

☁️ 本章的内容就是这么多啦!下一章给大家讲解指针的运算和数组与指针的关系!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。



目录
打赏
0
0
0
0
17
分享
相关文章
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
17 0
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
132 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
271 9
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
74 7
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
117 5
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
264 3
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
深入理解前端中的 “this” 指针:从基础概念到复杂应用
本文全面解析前端开发中“this”指针的运用,从基本概念入手,逐步探讨其在不同场景下的表现与应用技巧,帮助开发者深入理解并灵活掌握“this”的使用。
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
82 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等