c语言第三次课
一、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语言第三次课的更多相关文章
- 风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施
风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施 Python 语言可能发生的命令执行漏洞 内置危险函数 eval和exec函数 eval eval是一个python内置函数, ...
- NeHe OpenGL教程 第三十七课:卡通映射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第三十三课:TGA文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第三十一课:加载模型
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第三十课:碰撞检测
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Swift语言指南(三)--语言基础之整数和浮点数
原文:Swift语言指南(三)--语言基础之整数和浮点数 整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,3 ...
- ASP.NET MVC:多语言的三种技术处理策略
ASP.NET MVC:多语言的三种技术处理策略 背景 本文介绍了多语言的三种技术处理策略,每种策略对应一种场景,这三种场景是: 多语言资源信息只被.NET使用. 多语言资源信息只被Javascrip ...
- 基于C#程序设计语言的三种组合算法
目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...
- UWP 多语言的三个概念
首先了解一下 RFC4646 和 BCP-47 是什么东西: RFC4646 The name is a combination of an ISO 639 two-letter lowercase ...
随机推荐
- 数据结构(java版)学习笔记(一)——线性表
一.线性表的定义 线性表是n(n>=0)个具有相同特性的数据元素的有限序列. 线性表是最简单.最常用的一种数据结构 线性表属于线性结构的一种 如果一个数据元素序列满足: (1)除第一个和最后一个 ...
- Redis面试点
redis的数据结构有那些 字符串 String 字典:Hash 列表:List 集合:set 有序集合:sortedSet 如果大量的key设置在同一时间过期,一般需要注意什么 大量的key过期 ...
- Bootstrap方法之--排版、代码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 弹框在UC浏览器或者Android机器上会被顶上去
弹框在UC浏览器或者Android机器上会被顶上去 可以通过监听resize事件 this.height = $(document).height(); window.addEventListener ...
- Shell基础命令(二)
查看Linux的发行版 cat /etc/redhat-release cat /etc/os-release 查看系统用户的id信息 id 用户名 id root id 创建系统用户的命令 user ...
- 华为有AI,这场转型战有点大
华为有AI,这场转型战有点大 https://mp.weixin.qq.com/s/qnUP5cgbNxXcAT82NQARtA 李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为有AI ...
- word表格转html后去除冗余代码
word可以另存为html文件,通过这个功能,可以快速实现网页展示word内容,特别是表格的编辑,它包含tr.td.th.rowspan.colspan等内容,直接写比较繁琐. 但word转换过来的h ...
- 容器化系列 - 通过Grafana监测InfluxDB数据 on Docker
本文演示在Docker中运行Grafana和InfluxDB,并通过Grafana展示InfluxDB曲线图. 1 准备工作 1.1 安装Docker 请参考这里 1.2 下载镜像 $ docker ...
- vue(2)—— vue简单语法运用,常用指令集
按照前面的文章:vue(1)——node.js安装使用,利用npm安装vue 安装完vue之后,就可以使用vue了 vue vue简介 前面安装好vue之后,确实还没有对vue进行介绍,首先,官网: ...
- 20181218 - PostgreSQL Auto Commit Guide(自动提交)
20181218 - PostgreSQL Auto Commit Guide 参考官网简介,https://www.postgresql.org/docs/10/ecpg-sql-set-autoc ...