当前位置: 首页 > news >正文

讲一下我对C语言指针入门过程

网上关于这个指针的讲解多的不能再多了……,多到已经不知道看哪个了

本人比较笨,也是积累了很长一段时间才对指针有所掌握,指针涉及到的内容也比较多,就讲一下我是如何入门的,一些简单的基础

开始时候我会对这两个符号有很大迷惑“*”、“&”,一会出现等号左边一会右边的搞晕了;

在C语言有这样的定义大家应该都明白,不多说就是指针的类型和指向的数据类型为相同数据类型,这个应该也都明白;

首先要讲一个重要的概念就是计算机内存,就是我们定义的变量、这些变量会被分配在内存的一个固定或动态的内存地址里面,然而这些地址都是被提前编上编号的。我们在程序中想使用这些变量时,一个是直接使用变量名称,另外一个就是直接使用这个内存的地址对应的变量;

那这个变量对应的地址就可以用指针替代;

讲到这里好像大家也都明白,地址不就是指针吗,那我直接使用变量名称岂不是更方便,这样说也没毛病,对于一个新手肯定是喜欢直接使用变量名称,开始我也这么认为的。

这样就矛盾了,既然可以用变量干嘛还要创造一个指针出来?这也是我当时非常纠结这个问题!!!

只能说当时太嫩了!!!

我要讲两个很重要的指针应用,一个是数组,一个是结构体,

为什么要讲这两个应用,因为书上明确指出这两种变在内存地址里面是连续分配地址的,到今天我依然认为因为只有连续内存分配使用指针才能发挥它最大的作用,

想一下,我们看到很多的案例在函数参数传递参数时很少看到传递一个数组,而是传递一个指针和这个数组的大小,是不是有点熟悉的感觉。

比如定义 int a[100];

再定义一个指针int *p_a=a;  这就代表了p_a指向了a[0];

当然还有另外一种写法就是int *p_a=&a[0];

这样的话我们有了这个指针就可以实现对数组完全使用权限,想读取哪个数据读取那个数据;

写到这里好像还是没有写到重点;

重点来了,比如我们要这这数组进行初始化,全部置0;

我们是不是要写一个循环从0~100,分别等于0;

还有一种办法就使用内存操作

memset(a, 0, sizeof(a));            //可能对于初学者还是有些懵逼,这个就需要你们自己消化了

那这个memset是做什么的,这个就要看一下c语言基础,c语言的标准库#include <string.h> 

里面有很多关于内存的操作还有常用的memcpy内存拷贝

讲到这里我想讲的内容基本上差不多了

结构体的指针使用基本类似,也是对一块连续的内存的操作。

对于后面学习c++的类指针也是相似的概念

我们在学习指针操作和对内存的理解是分不开的,记得开始时候看书书上写到c语言的指针是一种不安全的存在,为什么这么说,因为知道了地址我可以对内存任何地址数据进行修改,这就是一个很危险的动作;想一想如果一台计算机上的软件没有任何防护控制导弹发射,如果有其他软件改写了内存的数据,很有可能会出现不可估计的后果;

若有不对的地方请指出……

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Web3 开发教程
  • IP 泄露: 原因与避免方法
  • 27-《木芙蓉》
  • docker环境安装kafka/Flink/clickhouse镜像
  • spring 不同service事务如何传递
  • Vue3自研开源Tree组件:人性化的拖拽API设计
  • 新手小白要如何自学黑客技术,看这篇就够了!
  • SpringBoot内置Tomcat启动原理
  • 装饰大师——装饰模式(Python实现)
  • UE5 UE4 使用python进行编辑器操作
  • 028-GeoGebra中级篇-脚本的初步的探索
  • python爬虫【3】—— 爬虫反反爬
  • 基于springboot的大学奖学金评定管理系统表结构调试讲解源码
  • 【vueUse库Utilities模块各函数简介及使用方法--第5篇】
  • C# timer.start()和timer1.Enabled=false;的区别
  • __proto__ 和 prototype的关系
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【技术性】Search知识
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • flutter的key在widget list的作用以及必要性
  • OSS Web直传 (文件图片)
  • php的插入排序,通过双层for循环
  • React 快速上手 - 07 前端路由 react-router
  • React组件设计模式(一)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • TypeScript迭代器
  • Vue2.x学习三:事件处理生命周期钩子
  • webpack4 一点通
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 聊聊sentinel的DegradeSlot
  • 漂亮刷新控件-iOS
  • 前端路由实现-history
  • 如何使用 JavaScript 解析 URL
  • 删除表内多余的重复数据
  • 使用parted解决大于2T的磁盘分区
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 用 Swift 编写面向协议的视图
  • puppet连载22:define用法
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #mysql 8.0 踩坑日记
  • (1)bark-ml
  • (2.2w字)前端单元测试之Jest详解篇
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)获取字符编码的类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (LLM) 很笨
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (算法)前K大的和
  • .NET 8.0 发布到 IIS
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存