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开发笔记(六十七)清单:ArrayList和LinkedList
前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...
- JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数
模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...
- 微信小程序解密得到unoinid和手机号 (开放数据的校验和解密 获取手机号)
实际测试 两种方法都可以: 第一种方法: public static string DecodeUserInfo(string encryptedData, string iv, string cod ...
- SAP MM 实施项目里Open PO 迁移思路探讨
SAP MM 实施项目里Open PO 迁移思路探讨 .序言. SAP项目上线前夕,除了静态主数据需要导入以外,可能还有一些动态数据,比如open的采购订单,open的销售订单等单据也要迁移到SA ...
- Mysql表分区的选择与实践小结
在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表,分区来解决这些性能瓶颈. 一. 选择合适的解决方法 1. 分库分表. 分库 ...
- Error: Invoke-customs are only supported starting with Android O (--min-api 26)
项目报错: 完美解决: 在App下 gradle.build中Android标签中 添加以下内容: compileOptions { sourceCompatibility JavaVersion.V ...
- Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块
Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函 ...
- sqlserver数据库触发器调用外部exe
sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...
- 【原创】Windows平台下Git的安装与配置
一.下载 msysgit是Git for Windows版,其Home Page为:http://msysgit.github.io/ 点击页面中“Download”进入下载列表.可根据个人喜 ...
- python 结巴分词学习
结巴分词(自然语言处理之中文分词器) jieba分词算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图(DAG), 再采用了动态规划查找最大概率路径,找出基于 ...