c语言第三次课

时间:2023-01-09 20:37:11

一、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语言指南&lpar;三&rpar;--语言基础之整数和浮点数

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

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

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

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

    目录 基于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. C&plus;&plus; 面试 (1) 指针

    指针是C++中一类颇具特色的数据类型,允许直接操作内存地址,实现内存的动态分配.指针问题通常包括指针常量,常量指针,数组指针,指针数组,函数指针,指针传值等. 指针和引用的区别 非空区别.在任何情况下 ...

  2. python服务器环境搭建(1)——本地服务器准备

    去年十月底到新公司上班,由于公司旧系统存在各种问题同时不便于扩展,而公司领导对17年寄予很大的期望,用户量.收入要上一个新台阶,我经过全面评估后,决定全部用python重构过,开发一个基于微服务架构的 ...

  3. 【一天一道LeetCode】&num;25&period; Reverse Nodes in k-Group

    一天一道LeetCode系列 (一)题目 Given a linked list, reverse the nodes of a linked list k at a time and return ...

  4. 软件工程&lowbar;5th weeks

    从周五开始经历了清明小长假,周六.周日和周一都处于假期状态,因此对于上篇博客的评论回复的很迟,而这周的工作做的也不多. 1.爆打小组 4.5日站立会议 时间:2016.4.5 15:00-15:34 ...

  5. lua(wax框架) 适配 64位操作系统

    ======================使wax框架真正兼容64位系统========================== 苹果强制要求所有新提交的应用必须兼容64位,但原来使用lua的框架wax ...

  6. Web负载均衡学习笔记之实现负载均衡的几种实现方式

    0x00 概要 负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web负载均衡.根 ...

  7. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  8. 深入分析tcp close与shutdown

    关闭socket-close 我们知道,tcp是一种支持全双工(full-duplex)通信的的协议,也就是说建立连接的两端可以在同一个时刻发送.接受数据.在需要关闭套接字的时候,我们一般调用: in ...

  9. python中的BaseManager通信(一)文件三分

    可以在windows下单机运行 主部分(提供服务器) #mainfirst.py from multiprocessing.managers import BaseManager import Que ...

  10. HTML5增强的表单

    form元素a.用来定义一个表单,是建立表单的基础元素(就类似定义表格的table)b.表单的其他元素包含在form元素中,其主要子元素有:input/button/select......form元 ...