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

/*
* 字符指针数组演示
* */
#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)的更多相关文章

  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. openstack部署keystone

    环境: 免密钥,域名解析 cat /etc/hosts 192.168.42.120 controller 192.168.42.121 compute 192.168.42.122 storage ...

  2. RESTful 介绍

    什么是RESTful?一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务端交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. ...

  3. 如何从项目中移除CocoaPods

    一.项目Show in Finder: 删除本地文件(Podfile.Podfile.lock.Pods文件夹) 删除本地生成的xcworkspace文件 打开项目,在Frameworks文件夹下,删 ...

  4. 引入easyui的404问题

    直接在webapp创建css文件夹添加easyui 引入: <link rel="stylesheet" type="text/css" href=&qu ...

  5. JavaScript DOM 编程艺术(第二版) 常用JS小脚本

    function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') ...

  6. python与正则

    想了解正则的使用,请点击:正则表达式.每种编程语言有一些独特的匹配方式,python也不例外: 语法 含义 表达实例 完整匹配匹配的字符串 \A 仅匹配字符串开头 \Aabc abc \Z 仅匹配字符 ...

  7. 4-2 编辑器之神--vim

    vim vi:Visual editor文本编辑器 文本:ascii,Unicode vim:VIsual editor iMproved 官网:www.vim.org 帮助网站:Vimhelp.or ...

  8. Android开发 互相调用模式之导出Aar包、扩展MainActivity、Java主导

    现在官方推荐使用这种方式 在讲导出Aar之前,先讲一下怎么设置图标,先把原xml中图标设置这句话复制过来 刚刚复制过来的时候这句话是红色报错的,这个时候我们把原res下的mipmap复制过来,也可以自 ...

  9. 【OpenJ_Bailian - 2790】迷宫(bfs)

    -->迷宫  Descriptions: 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不 ...

  10. 从零开始,SpreadJS 新人学习笔记(第二周)

    Hello,大家好,我是Fiona.经过上周的学习,我已经初步了解了SpreadJS的目录结构,以及如何创建Spread项目到我的工程目录中.>>还不知如何开始学习SpreadJS的同学, ...