建立正确程序运行内存的布局图(印象图)

内存四区模型图;

函数调用模型图;

数据类型的本质:固定大小内存块的别名

对于数组变量b[10];

b+1,与&b+1结果不一样;

b代表的是数组首元素的地址

&b代表的是整个数组的首地址

保证指针所指向的内存空间可以被修改(常量区的变量不能被修改

指针做函数参数,形参有多级指针的时候,站在编译器的角度,只需要分配4个字节的内存(32bit平台)

当我们使用内存的时候才关心指针所指向的内存是一维的还是两维的

指针也是一种数据类型,指针的数据类型是指向的内存空间的数据类型

含义:指针步长(p++),根据所指内存空间的数据类型来确定。

野指针产生的原因:

指针变量与它指向的内存空间是两个不同的概念,释放指针所指的内存空间了但是指针变量本身没有重置为NULL;

避免方法:定义指针的时候初始化为Null,释放指针所指的内存空间以后将指针变量重置为Null;

地址0开始的内存空间是操作系统保护的空间,应用程序不能随便的往里面写;

间接赋值的工程意义:

函数调用时,形参传给实参,用实参取地址传给形参,在被调用函数里面用*p(间接赋值)来改变实参,把运算结果传出去。

间接赋值需要满足三个条件:

1)两个变量(通常是一个实参,一个形参);

2)建立关系,实参取地址赋给形参指针;

3)*p 形参间接修改实参的值。

主调函数和被调函数的特点:

a)主调函数可以把堆区,栈区,全局数据内存地址传给被调用函数;

b)被调用函数只能返回堆区,全局数据;

内存分配:指针作为函数参数是有输入和输出的特性。

应用指针必须与函数调用相结合(指针做函数参数)

编号

指针函数参数

内存分配方式(级别+堆栈)

  主调函数实参 被调函数形参 备注
01 一级指针作输入
分配
分配
使用
使用
一般应用禁用
常用
02 一级指针作为输出 使用 结果输出 常用
03 二级指针作为输入
分配
分配
使用
使用
一般应用禁用
常用
04 二级指针作为输出 使用 分配 常用,但不建议使用,转化为02
05 三级指针作为输出 使用 分配 不常用

数组变量的变量名是个常量指针,是为了保证在析构内存的时候,保证所有的数组空间都被释放;

指针作为函数参数(输入、输出时),需要考虑参数是否能被写入。

如果不能被写入:则实参改为数组形式

c语言中没有你不知道的,只有你不会调

java语言中国没有你不会调的,只有你不知道的

在C语言中 Const是个伪命题,不是我们想象的那样。

例如 const int a=100;

int *p =&a;

*p = 1;

则此时a的值为1;

const char * p //修饰的是指针所指向的内存空间变量

char* const p //修饰的是指针变量

函数调用时,用n级指针(形参)改变n-1级指针(实参)的值

数组名是数组首元素的地址,它是一个常量;

数组首元素的地址与数组的地址相等,

int a[10];

printf("得到整个数组的地址:%d\n",&a);

printf("得到首元素的地址:%d\n",a);

二维数组参数退化的问题

二维数组可以看作为一维数组

二维数组中的每个元素是一个一维数组

二维数组参数中第一维的参数可以省略

void f(int a[5])  =======>>>    void f(int a[])  ======>>  void f(int* a);

void f(int a[3][5])    ======>>  void f(int a[][5])  =====>> void f(int (*a)[3]);//指向数组的数组指针

数组参数                                   等效的指针参数

一维数组 char a[30]                 char*

指针数组 char* a[30]               char** a

二维数组 char a[10][30]              char (*a)[30]

C语言企业级的需要学习的知识的更多相关文章

  1. 互联网世界中的C语言——我的golang学习笔记:1(基础语法快速过)

    前言 学习任何知识都会有一个学习背景 最近,我们团队乃至我司整个云服务,上go的呼声越来越高!新服务已经开始用go开发,部分现有Java版的服务重构为go也只是时间问题而已,故相关技术积累势在必行!在 ...

  2. 要成为一个 Java 架构师得学习哪些知识?

    作者:zhuqz链接:https://www.zhihu.com/question/29031276/answer/54631312来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  3. 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

  4. Java并发编程学习前期知识下篇

    Java并发编程学习前期知识下篇 通过上一篇<Java并发编程学习前期知识上篇>我们知道了在Java并发中的可见性是什么?volatile的定义以及JMM的定义.我们先来看看几个大厂真实的 ...

  5. 【机器学习与R语言】1-机器学习简介

    目录 1.基本概念 2.选择机器学习算法 3.使用R进行机器学习 1.基本概念 机器学习:发明算法将数据转化为智能行为 数据挖掘 VS 机器学习:前者侧重寻找有价值的信息,后者侧重执行已知的任务.后者 ...

  6. 欢迎关注我的微信公众账号:Linux技巧(微信号:irefactoring),一起学习Linux知识~~~

    最近很少写博客了,一方面是近期工作比较繁忙,第二是把精力都放在GitHub和读源码去了. 申请了一个微信公众账号:Linux技巧 微信ID:irefactoring(意思是爱重构) ========= ...

  7. C语言结构体的学习,以及gdb的调式

    #include <stdio.h> #include <string.h> #define format "%d\n%s\n%f\n%f\n%f\n" t ...

  8. Matrix学习——基础知识

    以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明. 首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部 ...

  9. 【python学习小知识】求绝对值和numpy和tensor的相互转换

    一.python求绝对值的三种方法 1.条件判断 2.内置函数abs() 3.内置模块 math.fabs 1.条件判段,判断大于0还是小于0,小于0则输出相反数即可 # 法1:使用条件判断求绝对值 ...

随机推荐

  1. rem是怎么计算的

    「rem」是指根元素(root element,html)的字体大小,从遥远的 IE6 到版本到 Chrome 他们都约好了,根元素默认的 font-size 都是 16px. rem是通过根元素进行 ...

  2. Log日志

    Log.e("tag", "错误信息");  Log.w("tag", "警告信息");  Log.i("ta ...

  3. Kotlin 检查空类型

    Kotlin 会检查你定义的非空类型 如果运行过程中被赋空值了  会直接crash

  4. word2vec概述

    既然是概述,那么我也只会在文中谈一点关于 Word2Vec 的思想和大概的方法.对于这个算法,如果一开始学习就深入到算法细节中,反而会陷入局部极值点,最后甚至不知道这个算法是干嘛的.在了解算法大概的思 ...

  5. hiho 1097 最小生成树一·Prim算法 (最小生成树)

    题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问 ...

  6. 【溯源分析】疑似"摩诃草"组织最新样本分析及域名资产揭露

    1)场景 摩诃草组织(APT-C-09),又称HangOver.Patchwork.Dropping Elephant以及白象.该组织归属南亚某国,主要针对中国.巴基斯坦等亚洲国家和地区进行网络间谍活 ...

  7. 给Ubuntu系统清理垃圾

    原文地址:https://blog.csdn.net/levon2018/article/details/81746613 1.清理下载的软件包  不过与你想象的可能有很大的不同,Ubuntu系统在运 ...

  8. Beta 冲刺(2/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(2/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 做了点商家数据表格 接下来的计划 做 ...

  9. 微信小程序语音与讯飞语音识别接口(Java),Kronopath/SILKCodec,ffmpeg处理silk,pcm,wav转换

    项目需求,需要使用讯飞的语音识别接口,将微信小程序上传的录音文件识别成文字返回 首先去讯飞开放平台中申请开通语音识别功能 在这里面下载sdk,然后解压,注意appid与sdk是关联的,appid在初始 ...

  10. [转]一个普通IT人的十年回顾---金旭亮

    金旭亮老师十年体会,很有收获.转自网络. 金旭亮于1989年与超级解霸的开发者梁肇新同时迈入广西大学的校门,却走了一条与其不同的路. 1994年起开始自学计算机专业本科课程,并开始编程,从未间断,迄今 ...