【C语言初阶】指针的详细解析(建议收藏)

这篇具有很好参考价值的文章主要介绍了【C语言初阶】指针的详细解析(建议收藏)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!

📋 前言

   🌈hello! 各位宝子们大家好啊,今天给大家带来的指针篇的初阶,带你先从底层一步步理解指针!
   ⛳️指针可以说是C语言最重要的部分了!俗话说,函数是C语言的核心,那么指针可以说就是咱们程序的灵魂了。
   📑不过不用但心读完这篇文章你就会发现指针也是那么回事,一学就懂!

   📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 什么是指针?

  ⛳️大家都知道我们计算机存储东西都是存储在内存,或者存储在硬盘里面。那么我们该如何管理我们的内存呢?这时就有人说那么我们把内存划分位一个个的字节,然后每个字节给上编号。这样是不是就容易管理我们的内存了!
【C语言初阶】指针的详细解析(建议收藏),《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根地址线产生的地址就会是:
    【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++

每个地址标识一个字节,那我们就可以给
(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;
}

📑 代码结果:
【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++

💭 指针类型的意义

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

#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 类型 解引用就只能访问一个字节

📚 代码演示:
【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++
🔥 总结:指针类型可以决定指针解引用的时候访问多少个字节(指针的权限)。

📖 指针的加减

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

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

📚 代码演示:

【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++

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

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

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

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

【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++
🔥 总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。

💬 野指针

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

📖 野指针成因

📝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;
}

📑 代码结果:
【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++

💬 如何规避野指针

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;
}

📝全篇总结

✅ 归纳:
好了以上就是关于什么是 指针和指针的注意事项就给大家讲解清楚了!有不会可以评论留言或私信博主呢!
  什么是指针
  指针类型的意义
  野指针成因
  如何避免野指针
☁️ 本章的内容就是这么多啦!下一章给大家讲解指针的运算和数组与指针的关系!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
【C语言初阶】指针的详细解析(建议收藏),《C语言初级篇》,c语言,开发语言,指针,算法,C++文章来源地址https://www.toymoban.com/news/detail-630282.html

到了这里,关于【C语言初阶】指针的详细解析(建议收藏)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初级网络工程师这30道面试题一定得会,建议小白收藏!

    你好,这里是网络技术联盟站。 后台有小伙伴想让瑞哥整理一下初级网络工程师面试题,今天我整理出来了,针对初级网络工程师,我们在面试的时候主要考察的是基础概念,下面列举的希望大家可以收藏,平时多看看,增加印象。 1、请解释什么是TCP/IP协议? 答:TCP/IP是一

    2024年02月04日
    浏览(42)
  • Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏)

    Java也是测试必知必会的内容,特别是现在类似spring boot 等Java框架更是成为主流。之前实现的图书增删改查是用Python实现的,没看过的请移步:Flask+mysql 实现增删改查接口开发+测试(图文教程附源码),本次给大家带来用Java实现的后端接口版本,并根据之前的项目总结有做一

    2024年02月03日
    浏览(50)
  • C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

    结构是一些值的集合,这些值称为 成员变量 。 结构的每个成员可以是不同类型的变量 。 注意 : 成员列表可以是不同类型的变量; 成员后一定要有分号; 花括号后也有一个分号。 例如描述一个学生: 注意:上述代码没有创建变量,也没有初始化, 只是声明了一个结构体类

    2024年03月13日
    浏览(53)
  • 微信小程序详细教程,两小时零基础注册和使用小程序,并利用Ai引擎真正0代码开发小程序!!!(干货,建议收藏)

    一台电脑 下载并安装微信开发者工具 一个微信扫码登录         随着科技的飞速发展和互联网的普及,微信作为一款社交媒体平台,已经渗透到我们日常生活的方方面面。无论是老年人还是年轻人,无论是城市还是农村,微信的用户群体已经覆盖了各个年龄段和各个社会阶

    2024年02月03日
    浏览(57)
  • 前端学习C语言 - 初级指针

    本篇主要介绍: 指针和变量的关系 、指针类型、 指针的运算符 、空指针和野指针、 指针和数组 、 指针和字符串 、const 和指针、以及 gdb 调试段错误 。 指针是一种特殊的变量。存放地址的变量就是指针。 int num = 1; 会申请4个字节的内存来存放数字1,每次访问 num 就是访问

    2024年02月10日
    浏览(42)
  • C++入门(详细解读,建议收藏)

            C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语

    2024年02月02日
    浏览(68)
  • 微信小程序详细教程(建议收藏)

    1. 小程序的安装与创建 第一步 打开小程序官网 第二步 找到开发管理,找到开发设置,下面有一个 AppID ,复制即可,后面开发小程序需要用 新建项目 ,需要先下载微信开发工具下载网址,安装完成之后进入如下的界面。复制刚才的AppID,选择 不使用云开发 , javascript基础模

    2024年02月03日
    浏览(46)
  • Springboot集成Freemarker|超级详细,建议收藏

    上一期,我是带着大家入门了 SpringBoot集成Kafka ,今天我再来一期Freemarker的零基础教学吧。不知道大家对kafka有多少了解,反正我就是从搭建开始,然后再加一个简单演示,这就算是带着大家了个门哈,剩下的我再后边慢慢出教程给大家说。 演示环境:idea2021 + springboot 2.3.1

    2024年02月11日
    浏览(36)
  • vim命令大全,非常详细,强烈建议收藏!

    Vim是一款常用的文本编辑器,具有强大的功能和高度的可定制性。在本文中,我们将详细介绍Vim的常用命令,并提供相关的示例。如果您是初学者或已经熟练使用Vim,这篇文章都能为您提供帮助。 以下是一些基本的Vim命令: i :在当前光标位置插入文本。 x :删除当前光标所

    2024年02月15日
    浏览(40)
  • ~~~超详细Nginx安装教程,建议收藏保存

    1.1、Nginx概述 Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 1.2、Nginx作为web服务器 Nginx可以作

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包