C语言中的指针(二)
指针指向谁,就把谁的地址赋给指针,指针变量和指针指向的内存变量是不一样的。不停的给指针赋值,相当于是不断的改变指针的指向。
在开发中要避免野指针的存在,在指针使用完毕之后,记得要给指针赋值成为NULL。
*就像一把钥匙,拿着指针变量中的地址区修改对应内存中的数值。
指针做函数参数是学习C语言中的核心内容。
间接赋值的三个条件
1,存在两个变量,
2,进行取地址赋值
3,,用*p来进行内存空间内容的修改。
指针的输入特性和输出特性。
字符串的两头堵模型。
字符串指向的内存空间如果是在常量区是不能进行修改的,如果想进行修改,就要显示的分配内存空间才可以
用const修饰指针。
每次进行递归调用的时候,都会将函数参数入栈。
关于递归有两点需要掌握:
递归参数的入栈模型
函数嵌套调用返回模型。
在进行递归调用的时候,一定要清楚哪些参数是不变的,哪些参数是变化的。
二级指针的内存模型:
二级指针做输入和输出模型
二级指针的第一种内存模型
在分配内存的时候,记得一定要free掉,同时避免野指针。将指针变量置成NULL。
指针做输出,被调用函数分配内存。
二级指针做输入的三中模型。
二级指针做输入的第一种内存模型:
指针数组,是数组,类型是指针变量。char * buf[] = {"abc","123","dfg"}。类似于这一种方式。基本操作就是排序或者是打印输出类似这一种的操作。
第二种内存模型:
问题的本质,就是,第二种内存模型和第一种内存模型的内存模型不一样,指针所指向的内存空间的数据类型是不一样的。
就是二维数组变量,不过二级指针变量会退化成为一级指针变量问题。
不能使用地中内存模型中的方式来求取元素的个数,因为第二种方式是一次性的分配指定大小的内存空间,可是你病并不一样对一次性的使用完全。
编译器只会关心有多少行,每行有多少列,关心这个就是关系步长的问题。
第三种内存模型:
自己定义内存空间,就是所谓的按需打造内存空间。其实和第一种模型没有他大的区别。
理解递归的两点
1、参数的入栈模型
2、函数的返回流程
关于C语言中的const,是优点区别的,最重要的一点就是区分指针类型和指针指向的变量空间是不同的概念。
多级指针避免野指针
数组类型,数组指针类型,指针数组类型。
多维数组名和一个指向数组类型的指针变量是类似的。
多维数组名的本质就是一个数组指针,每次跳一维数组的长度大小。
数组在作为函数参数的时候会退化成为一个数组指针。
在分配好内存之后习惯将内存数据置为0,这是为了更好的释放内存空间。便于判断是否对内存进行了操作。
C语言中的指针(二)的更多相关文章
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
- C语言中的指针加减偏移量
C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客 https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...
- C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- 论C语言中二级指针和二维数组之间的区别
刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...
- C语言中的指针和内存泄漏
引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...
随机推荐
- Win8 恢复传统启动菜单 for 多系统
如果你安装了Win7和Win8,启动的时候得先启动到Win8然后再启动到Win7,很怀念原来的启动选择器,这里给你方法了~ 当前系统是Win8的输入 bcdedit /set {current} bo ...
- VueJS事件处理器v-on
事件监听可以使用 v-on 指令. v-on:click表达式 HTML: <!DOCTYPE html> <html> <head> <meta chars ...
- android 怎样单独下载一个项目
起因,"网络"不太好."比方铁通的就是不如联通的" 每次运行一边repo sync,十分蛋疼,假设不做full build无需所有下载,着急看某个项目的修改但是 ...
- URL Handle in Swift (二) — 响应链处理 URL
最后更新: Swift4时候的博客,以前在 CMD markdown 上编辑的,现在搬到这里 在上篇文章-URL Handle in Swift (一) -- URL 分解中,我们已经将URL进行了分 ...
- springboot 项目中控制台打印日志以及每天生成日志文件
1.控制台打印sql语句 只要在application.properties 中加入<configuration scan="true" scanPeriod=" ...
- 如何利用Require.Js管理多页面站点文件(译)
英文版地址 最近使用 Require.Js 的时候我发现它确实是一个改善代码管理的一个好方法.我以前发表Backbone类的文章时曾提到过 Require,但此前,我从未在传统的多页面网站内使用到 R ...
- [jjzhu学java]之solr4.9同步mysql数据
Solr是一个高性能,採用Java5开发,基于Lucene的全文搜索server.同一时候对其进行了扩展,提供了比Lucene更为丰富的查询语言,同一时候实现了可配置.可扩展并对查询性能进行了优化,而 ...
- CentOS6下基于Nginx搭建mp4/flv流媒体服务器
CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 1.先添加几个RPM下载源 1.1)安装RPMforge的CentOS6源 [roo ...
- 向oracle中插入date时,持久层sql怎么写???
public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...
- Docker入门系列7 动态映射端口port mapping
为何想要动态映射端口呢? 因为刚开始run启动容器时,并不知道里面需要映射哪些端口,等容器已创建了,想映射端口. 当然可以通过先commit成镜像,然后再次run时指定端口,但会生成中间的镜像,对于有 ...