标准C语言(10)
指针数组的每个存储区是一个指针类型的存储区,字符指针数组包含多个字符类型的指针,每个字符类型指针可以代表一个字符串.字符指针数组可以用来代表多个相关字符串,二维字符数组也可以用来记录多个相关字符串,通常采用字符指针数组记录多个相关字符串
/*
* 字符指针数组演示
* */
#include <stdio.h>
int main() {
//char *strs[] = {"abc", "def", "xyz",
//"iop", "vbn"};
char strs[][10] = {"abc", "def", "xyz",
"iop", "vbn"};
int num = 0;
for (num = 0;num <= 4;num++) {
printf("%s\n", strs[num]);
}
return 0;
}
主函数的第二个参数是一个字符指针数组,其中每个指针代表一个字符串,这些字符串的内容来自于执行命令时输入的内容.主函数的第一个参数是整数类型的,它用来表示第二个参数里有效指针的个数
/*
* 主函数参数练习
* */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int heads = 0, legs = 0, num = 0;
if (argc < 3) {
printf("命令错误\n");
return 0;
}
heads = atoi(argv[1]);
legs = atoi(argv[2]);
for (num = 0;num <= heads;num++) {
if (4 * num + 2 * (heads - num) == legs) {
printf("兔子有%d只,鸡有%d只\n", num, heads - num);
return 0;
}
}
return 0;
}
#define预处理指令可以用来定义宏,宏可以用来给数字起名字,定义宏的时候要把名称写在前面,名称代表的数字写在后面,宏名称通常只包含大写英文字母,宏名称里不可以有空格.用宏给数字起名字的时候不应该使用赋值操作符,编译器会把程序里的宏名称替换成它所代表的数字
/*
* 宏演示
* */
#include <stdio.h>
#define PI 3.14f
#define CIRCLE(r) 2 * PI * r
int main() {
float pi = 3.14f;
int radius = 0;
printf("请输入半径:");
scanf("%d", &radius);
printf("周长是%g\n", CIRCLE(radius));
printf("周长是%g\n", 2 * pi * radius);
return 0;
}
可以在编译命令里使用-D选项指定宏名称代表的数字
如果程序中有些数字只能在编译的时候才知道就可以采用宏代表它们
宏还可以用来给计算公式起名字,计算公式里包含未知数字,宏可以用参数表示这些未知数字
/*
* 宏练习
* */
#include <stdio.h>
#define SUB(x, y) x - y
int main() {
int num = 0, num1 = 0;
printf("请输入两个数字:");
scanf("%d%d", &num, &num1);
printf("相减结果是%d\n", SUB(num, num1));
return 0;
}
计算机采用二次替换的方式处理带参数的宏
宏的参数可以不代表数字,它没有类型名称
/*
* 宏演示
* */
#include <stdio.h>
#define SUB(x, y) ((x) - (y))
int main() {
printf("SUB(10, 5)是%d\n", SUB(10, 5));
printf("20 - SUB(10, 5)是%d\n", 20 - SUB(10, 5));
printf("SUB(20, 10 - 5)是%d\n", SUB(20, 10 - 5));
return 0;
}
如果宏有多个参数就应该在小括号里写多个参数名称,相邻的参数名称之间用逗号分开
宏不能使用自己的存储区和函数之间进行数据传递,宏没有形式参数也没有用来存放返回值的存储区
能当作数字使用的宏必须编写成表达式(因为宏没有用来记录返回值的存储区的)
宏的参数可以直接代表函数的存储区,对宏参数内容的修改就是对函数存储区内容的修改(因为宏没有形式参数)
因为宏没有用来存放返回值的存储区,所以不能保证优先计算宏里面的操作符,所有能当作数字使用的宏都必须写在小括号里面
/*
* 宏练习
* */
#include <stdio.h>
#define SQUARE(n) ((n) * (n))
int main() {
int num = 5;
printf("SQUARE(5)是%d\n", SQUARE(5));
printf("SQUARE(++num)是%d\n", SQUARE(++num));
return 0;
}
宏没有形式参数所以不能保证优先计算参数里面的操作符,编写宏的时候应该把所有能当作数字使用的参数都写在小括号里
不要把自增或自减的结果作为宏的参数使用
编写宏的时候可以使用一些特殊的符号,它们叫做宏操作符
#是一个宏操作符,它可以把宏的参数转换成字符串字面值
##也是一个宏操作符,它可以把一个代表标识符的参数和其他内容连接得到一个新的标识符
/*
* 宏操作符演示
* */
#include <stdio.h>
#define STR(n) #n
#define PTR(n) p_##n
int main() {
int num = 0;
int *PTR(num) = #
STR(2 + 3);
return 0;
}
条件编译可以在编译时从几组语句里选择一组编译而忽略其他组
#ifdef/#ifndef...#else...#endif
这个结构可以根据一个宏名称是否被定义过从两组语句里选择一组编译.最开始的预处理指令要从两个里选择一个,不论选择哪个后面都要写一个宏名称.如果选择#ifdef就表示它后面的宏名称被定义过的时候编译前一组语句,否则编译后一组语句,如果选择#ifndef就和#ifdef刚好相反
/*
* 条件编译演示
* */
#include <stdio.h>
int main() {
//#ifdef YI
#ifndef ER
printf("1\n");
#else
printf("2\n");
#endif
return 0;
}
#if...#elif(任意多次)...#else...#endif
以上结构也可以实现条件编译,它可以根据任意逻辑表达式从多组语句中选择一组编译
/*
* 条件编译练习
* */
#include <stdio.h>
int main() {
int order = 0;
printf("请点菜:");
scanf("%d", &order);
#ifdef ZHAOBENSHAN
if (order == 1) {
printf("没有\n");
}
else {
printf("真没有\n");
}
#else
if (order == 1) {
printf("有\n");
}
else {
printf("没有\n");
}
#endif
return 0;
}
标准C语言(10)的更多相关文章
- 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析
零. 优先级 在C++ Primer一书中,对于运算符的优先级是这样描述的: Precedence specifies how the operands are grouped. It ...
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- 关于标准C语言的预定义宏【转】
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__ 当 ...
- 关于标准C语言的预定义宏
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__ 当前 ...
- UML标准建模语言与应用实例
一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...
- UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。
UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...
- Python标准库笔记(10) — itertools模块
itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...
- 标准C 语言总结
***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...
- 标准C语言(1)
C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...
随机推荐
- Python:Base2(List和Tuple类型, 条件判断和循环,Dict和Set类型)
1.Python创建list: Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: &g ...
- Oracle:常用操作(定时作业,逻辑导入,数据泵导入)
1.逻辑导入: /*第1步:创建临时表空间 **/ create temporary tablespace user_temp1 tempfile 'D:\app\Administrator\orad ...
- QT5中编译存在的几个问题(LNK2019,构造函数不能有返回类型)
1. 自己构造新类,注意必须在头文件最后加上分号 写个c++类报“构造函数不能有返回类型”, 谷歌一下,才找到原因: 原来是我定义的类后面没有用“:”结尾,构造函数默认把整个类作为返回值了 2. 新建 ...
- VIM全总结
Vim是Linux自带的编辑器,是Vi的高级版,刚开始使用我是一脸懵逼的,跟普通的编辑器完全不同,基本全靠键盘,写完之后也不知道怎么保存,特地花了点时间了解了一下,还是挺简单的.其中,主要包含三种模式 ...
- SolidWorks学习笔记1
鼠标 修改缩放方向 点击工具->选项->视图,点击第一条,翻转鼠标滚轮缩放方向. 平移:Ctrl+ 中键 或者右键空白处 菜单选择平移 缩放:Shift+中键 或者右键空白处 菜单选择放大 ...
- SpringBoot 启动失败 Failed to determine a suitable driver class 问题解决方案
Description: Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no ...
- 尝试自己搭一个简单的typescript运行环境
开发typescript项目有一些现成的脚手架,比如:typescript-library-starter,它的配置齐全,更适合用在实际项目开发上.其实在学习阶段可以自己搭建一个简单的typescri ...
- c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)
一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...
- mongodb 数据操作(2)
查询 db.student.find({}) 查询db.student.find({name:"李强1"}) 查询 条件查询 db.student.find({sex:&quo ...
- certutil 命令配合PS反弹后门
Certutil.exe是一个命令行程序,作为证书服务的一部分安装.您可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件以及验证证书,密钥对和证书 ...