一、const的使用
1)const声明变量为只读

const int a = ;
a = ; //error char buf[] = "abcdef";
const char *p = buf;
char const *p = buf; //修饰*,指针指向能变,指针指向的内存不能变
//p[0] = '1'; //error
p = ""; //ok char * const p1 = buf; //修饰指针变量,指针指向的内存,指针指向不能变
//p1 = "123456"; //error
p1[] = ''; //ok const char * const p2 = buf; //p2, 只读

二、多级指针
1)如何定义合适类型的指针变量
//某个变量的地址需要定义一个怎么样类型的变量保存
//在这个类型的基础上加一个*

int b;
int *q = &b; //一级指针
int **t = &q; //二级指针
int ***m = &t; //三级指针

2)二级指针做输出
输入:主调函数分配内存
输出:被调用函数分配内存

char *p1 = NULL; //没有分配内存
int len = ;
getMem(&p1, &len); //要想通过函数的形参改变实参的值,必须地址传递 void getMem(char **p1 /*out*/, int *plen /*in*/)
{
//间接赋值,是指针存在最大的意义。
*p1 = malloc();
*plen = ;
}

3)二级指针做输入的三种内存模型
1、

//指针数组,数组的每个元素都是指针类型
// [] 的优先级比 * 高,它是数组,每个元素都是指针类型(char *)
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", ""}; char **p = {"aaaaaa", "ccccc", "bbbbbb", ""}; //err void fun(int a[]);
void fun(int *a); // a[] 等价于 *a void printMyArray(char *myArray[], int num);
// char *代表类型,myArray[]等价于 *myArray
// char *myArray[] -> char ** myArray void printMyArray(char **myArray, int num);
void sortMyArray(char **myArray, int num);

如果排序,交换的是指针的指向,因为原来指针指向是文字常量区,文字常量区的内存一旦分配,内存就不能变。

2、

//二维数组 10行30列,10个一维数组a[30]
//总共能容量10行字符串,这个用了 4 行
//每行字符串长度不能超过29,留一个位置放结束符:数字0
char myArray[][] = {"aaaaaa", "ccccc", "bbbbbbb", ""}; void printMyArray(char myArray[][], int num);
void sortMyArray(char myArray[][], int num); char a[][] = {"aaaaaa", "ccccc", "bbbbbbb", ""};//ok
char a[][]; //err,定义时必须初始化

二维数组的数组名代表首行地址(第一行一维数组的地址)
首行地址和首行首元素地址的值是一样的,但是它们步长不一样
首行地址+1,跳过一行,一行30个字节,+30
首行首元素地址+1,跳过一个字符,一个字符为1个字节,+1
sizeof(a): 有4个一维数组,每个数组长度为30,4 * 30 = 120
sizeof(a[0]): 第0个一维数组首元素地址,相当于测第0个一维数组的长度:为30

char b[30];
&b代表整个一维数组的地址,相当于二维数组首行地址
b代表一维数组首元素地址,相当于二维数组首行首元素地址
&b 和 b 的值虽然是一样,但是,它们的步长不一样
&b + 1: 跳过整个数组,+30
b+1: 跳过1个字符,+1

//不能通过 char ** 作为函数形参,因为指针+1步长不一样
// char **,指针+1步长为 4 个字节
// char a[][30],指针+1步长为 1 行的长度,这里为 30 个字节
void printMyArray(char **buf, int num);

3、

int a[];
int *q = (int *)malloc( * sizeof(int)); //相当于q[3] //动态分配一个数组,每个元素都是char *
int n = ;
char **buf = (char **)malloc(n * sizeof(char *)); //相当于 char *buf[3]
for (i = ; i < n; i++)
{
buf[i] = (char *)malloc( * sizeof(char));
} char **myArray = NULL;
char **getMem(int num); //手工打造二维数组
void printMyArray(char **myArray, int num);
void sortMyArray(char **myArray, int num);
void arrayFree(char **myArray, int num);

4)三种二级指针内存模型图

c语言第三次课的更多相关文章

  1. 风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施

    风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施 Python 语言可能发生的命令执行漏洞 内置危险函数 eval和exec函数 eval eval是一个python内置函数, ...

  2. NeHe OpenGL教程 第三十七课:卡通映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. NeHe OpenGL教程 第三十三课:TGA文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第三十一课:加载模型

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第三十课:碰撞检测

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. Swift语言指南(三)--语言基础之整数和浮点数

    原文:Swift语言指南(三)--语言基础之整数和浮点数 整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,3 ...

  7. ASP.NET MVC:多语言的三种技术处理策略

    ASP.NET MVC:多语言的三种技术处理策略 背景 本文介绍了多语言的三种技术处理策略,每种策略对应一种场景,这三种场景是: 多语言资源信息只被.NET使用. 多语言资源信息只被Javascrip ...

  8. 基于C#程序设计语言的三种组合算法

    目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...

  9. UWP 多语言的三个概念

    首先了解一下 RFC4646 和 BCP-47 是什么东西: RFC4646 The name is a combination of an ISO 639 two-letter lowercase ...

随机推荐

  1. DevOps让研发人员越来越失望?比如工作量与报酬

    作为一名工程师,您在开发软件时已经有足够的责任.在您的工作日活动中添加更多任务(比如与DevOps相关的任务)可能听起来不太吸引人.使用DevOps,您不仅负责生成工作软件,而且现在还需要自动化软件的 ...

  2. Centos7.3安装和配置Mysql5.7

    主要转自这篇文章:https://www.cnblogs.com/wishwzp/p/7113403.html 这篇文章已经讲的很详细,亲测可用,对于基本不懂linux的小白应该也能看得懂.只是没有修 ...

  3. Building QGIS from source - step by step(随笔3)

    依赖包安装 在编译QGIS前分别需要利用cygwin和OSGeo4W 安装网站上的依赖库.分别需要安装的依赖库可以参考官网,此外对应版本的ygwin和OSGeo4W 也可以在网站上找到下载链接. ht ...

  4. ionic3 Modal组件

     Modal组件主要用来弹出一些临时的框,如登录,注册的时候用 弹出页面html页面 <button ion-button small outline color="he" ...

  5. 深入了解Object.defineProperty

    原来写文章都是一次写两三个小时写完,偶尔看到一个人的博客了解到还有草稿箱这个功能,所以以后写文章的时候就舒服多了哈哈,可以存起来再发,不需要一口气写完了 最近一直在看JavaScript高级程序设计, ...

  6. MySQL 处理海量数据时的一些优化查询速度方法

    查询速度慢的原因 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O 吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6 ...

  7. input(type='file')上传多张照片并显示,传到后台

    以下内容为网络摘抄和实践修改所得,如有雷同,请谅解!!!! 1.首先是前端页面代码: 其中,<input type="file" id="file_input&qu ...

  8. AngularJS学习之旅—AngularJS Http(九)

    1.AngularJS XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. eg: // 简单的 GET 请求,可以改为 POST $htt ...

  9. c#操作SQL Server入门总结

    我是一名c#新手.本文只是我是常学习的随笔. 一.下载SQL server软件 听说下载开发板是最好的(开发板如果只是用来学习.研究不算是侵权).在安装的时候,我也遇到了很多问题,在公司的电脑安装第一 ...

  10. git冲突解决办法合集

    一 换行符CRLF错误解决办法 1 错误产生原因 不同的操作系统使用的换行符是不一样的. unix/linux使用的是LF,max后期也采用了LF,但在windows一直采用的CRLF(回车)换行符. ...