指针数组的每个存储区是一个指针类型的存储区,字符指针数组包含多个字符类型的指针,每个字符类型指针可以代表一个字符串.字符指针数组可以用来代表多个相关字符串,二维字符数组也可以用来记录多个相关字符串,通常采用字符指针数组记录多个相关字符串

  1. /*
  2. * 字符指针数组演示
  3. * */
  4. #include <stdio.h>
  5. int main() {
  6. //char *strs[] = {"abc", "def", "xyz",
  7. //"iop", "vbn"};
  8. char strs[][10] = {"abc", "def", "xyz",
  9. "iop", "vbn"};
  10. int num = 0;
  11. for (num = 0;num <= 4;num++) {
  12. printf("%s\n", strs[num]);
  13. }
  14. return 0;
  15. }

主函数的第二个参数是一个字符指针数组,其中每个指针代表一个字符串,这些字符串的内容来自于执行命令时输入的内容.主函数的第一个参数是整数类型的,它用来表示第二个参数里有效指针的个数

  1. /*
  2. * 主函数参数练习
  3. * */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. int main(int argc, char *argv[]) {
  7. int heads = 0, legs = 0, num = 0;
  8. if (argc < 3) {
  9. printf("命令错误\n");
  10. return 0;
  11. }
  12. heads = atoi(argv[1]);
  13. legs = atoi(argv[2]);
  14. for (num = 0;num <= heads;num++) {
  15. if (4 * num + 2 * (heads - num) == legs) {
  16. printf("兔子有%d只,鸡有%d只\n", num, heads - num);
  17. return 0;
  18. }
  19. }
  20. return 0;
  21. }

#define预处理指令可以用来定义宏,宏可以用来给数字起名字,定义宏的时候要把名称写在前面,名称代表的数字写在后面,宏名称通常只包含大写英文字母,宏名称里不可以有空格.用宏给数字起名字的时候不应该使用赋值操作符,编译器会把程序里的宏名称替换成它所代表的数字

  1. /*
  2. * 宏演示
  3. * */
  4. #include <stdio.h>
  5. #define PI 3.14f
  6. #define CIRCLE(r) 2 * PI * r
  7. int main() {
  8. float pi = 3.14f;
  9. int radius = 0;
  10. printf("请输入半径:");
  11. scanf("%d", &radius);
  12. printf("周长是%g\n", CIRCLE(radius));
  13. printf("周长是%g\n", 2 * pi * radius);
  14. return 0;
  15. }

可以在编译命令里使用-D选项指定宏名称代表的数字

如果程序中有些数字只能在编译的时候才知道就可以采用宏代表它们

宏还可以用来给计算公式起名字,计算公式里包含未知数字,宏可以用参数表示这些未知数字

  1. /*
  2. * 宏练习
  3. * */
  4. #include <stdio.h>
  5. #define SUB(x, y) x - y
  6. int main() {
  7. int num = 0, num1 = 0;
  8. printf("请输入两个数字:");
  9. scanf("%d%d", &num, &num1);
  10. printf("相减结果是%d\n", SUB(num, num1));
  11. return 0;
  12. }

计算机采用二次替换的方式处理带参数的宏

宏的参数可以不代表数字,它没有类型名称

  1. /*
  2. * 宏演示
  3. * */
  4. #include <stdio.h>
  5. #define SUB(x, y) ((x) - (y))
  6. int main() {
  7. printf("SUB(10, 5)是%d\n", SUB(10, 5));
  8. printf("20 - SUB(10, 5)是%d\n", 20 - SUB(10, 5));
  9. printf("SUB(20, 10 - 5)是%d\n", SUB(20, 10 - 5));
  10. return 0;
  11. }

如果宏有多个参数就应该在小括号里写多个参数名称,相邻的参数名称之间用逗号分开

宏不能使用自己的存储区和函数之间进行数据传递,宏没有形式参数也没有用来存放返回值的存储区

能当作数字使用的宏必须编写成表达式(因为宏没有用来记录返回值的存储区的)

宏的参数可以直接代表函数的存储区,对宏参数内容的修改就是对函数存储区内容的修改(因为宏没有形式参数)

因为宏没有用来存放返回值的存储区,所以不能保证优先计算宏里面的操作符,所有能当作数字使用的宏都必须写在小括号里面

  1. /*
  2. * 宏练习
  3. * */
  4. #include <stdio.h>
  5. #define SQUARE(n) ((n) * (n))
  6. int main() {
  7. int num = 5;
  8. printf("SQUARE(5)是%d\n", SQUARE(5));
  9. printf("SQUARE(++num)是%d\n", SQUARE(++num));
  10. return 0;
  11. }

宏没有形式参数所以不能保证优先计算参数里面的操作符,编写宏的时候应该把所有能当作数字使用的参数都写在小括号里

不要把自增或自减的结果作为宏的参数使用

编写宏的时候可以使用一些特殊的符号,它们叫做宏操作符
  #是一个宏操作符,它可以把宏的参数转换成字符串字面值
  ##也是一个宏操作符,它可以把一个代表标识符的参数和其他内容连接得到一个新的标识符

  1. /*
  2. * 宏操作符演示
  3. * */
  4. #include <stdio.h>
  5. #define STR(n) #n
  6. #define PTR(n) p_##n
  7. int main() {
  8. int num = 0;
  9. int *PTR(num) = #
  10. STR(2 + 3);
  11. return 0;
  12. }

条件编译可以在编译时从几组语句里选择一组编译而忽略其他组
  #ifdef/#ifndef...#else...#endif
这个结构可以根据一个宏名称是否被定义过从两组语句里选择一组编译.最开始的预处理指令要从两个里选择一个,不论选择哪个后面都要写一个宏名称.如果选择#ifdef就表示它后面的宏名称被定义过的时候编译前一组语句,否则编译后一组语句,如果选择#ifndef就和#ifdef刚好相反

  1. /*
  2. * 条件编译演示
  3. * */
  4. #include <stdio.h>
  5. int main() {
  6. //#ifdef YI
  7. #ifndef ER
  8. printf("1\n");
  9. #else
  10. printf("2\n");
  11. #endif
  12. return 0;
  13. }

#if...#elif(任意多次)...#else...#endif
以上结构也可以实现条件编译,它可以根据任意逻辑表达式从多组语句中选择一组编译

  1. /*
  2. * 条件编译练习
  3. * */
  4. #include <stdio.h>
  5. int main() {
  6. int order = 0;
  7. printf("请点菜:");
  8. scanf("%d", &order);
  9. #ifdef ZHAOBENSHAN
  10. if (order == 1) {
  11. printf("没有\n");
  12. }
  13. else {
  14. printf("真没有\n");
  15. }
  16. #else
  17. if (order == 1) {
  18. printf("有\n");
  19. }
  20. else {
  21. printf("没有\n");
  22. }
  23. #endif
  24. return 0;
  25. }

标准C语言(10)的更多相关文章

  1. 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析

    零. 优先级    在C++ Primer一书中,对于运算符的优先级是这样描述的:     Precedence specifies how the operands are grouped. It ...

  2. 标准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 ...

  3. 关于标准C语言的预定义宏【转】

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__  当 ...

  4. 关于标准C语言的预定义宏

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__  当前 ...

  5. UML标准建模语言与应用实例

    一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...

  6. UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。

    UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...

  7. Python标准库笔记(10) — itertools模块

    itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...

  8. 标准C 语言总结

    ***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...

  9. 标准C语言(1)

    C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...

随机推荐

  1. 比较Json.Net和fastJson的效率

    var zoo1 = new zoo(); zoo1.animals = new List<animal>(); zoo1.animals.Add(new cat()); zoo1.ani ...

  2. npm scripts

    参考资料1:[https://docs.npmjs.com/misc/scripts] 参考资料2:[http://www.ruanyifeng.com/blog/2016/10/npm_script ...

  3. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  4. JAVA师徒架构班 - 带徒模式

    (转: http://www.jeecg.org/forum.php?mod=viewthread&tid=2291&extra=page%3D1&page=1) 一个程序员技 ...

  5. Angular项目里Js代码里如何获取Ts文件中的属性数据

    基于之前实现的Angular+ngx-ueditor富文本编辑器做一个简单补充记录,我们在使用Angular开发过程中,难免会使用到调用外部插件Js的应用,但是有的时候又需要在Js文件中调用Ts文件里 ...

  6. 客户端数据存储cookie、localStoeage、sessionStorage(小记)

    一.数据存储分为客户端存储和服务端存储 1.而对于客户端存储,在html5以前只能通过cookie来实现:html 5以后增加了web存储(实际保存本地)的功能   (1)对于web存储有两个标准: ...

  7. 关于一个查询的JAVA界面,希望对你有启发

    package work2; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; ...

  8. 索引及explain 详解

    索引的分类: 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个 组合索引:多列值组成一个索引,专门用于组合 ...

  9. .Net Core Web应用加载读取Json配置文件

    ⒈添加Json配置文件并将“复制到输出目录”属性设置为“始终复制” { "Logging": { "LogLevel": { "Default&quo ...

  10. RuntimeError: Model class user.models.User doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

    Django 2.x版本迁移数据库报这个错误,user表使用的Django的验证系统 本来就想改一下用户表的表名,莫名的报了个这个错误,在网上找到了解决办法 打开user应用模块下的apps.py文件 ...