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

/*
* 字符指针数组演示
* */
#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. ubuntu下wps的安装

    (一)安装 1)下载:WPS For Linux http://community.wps.cn/download/ 下载wps-office_10.1.0.5672~a21_amd64.deb 2) ...

  2. appium+python+windows环境配置

    一.安装node.js 1:先找到对于电脑合适的node版本进行下载. 我的云盘node版本是7.8.0.地址如下:https://pan.baidu.com/s/19kcpXhCN1AuJAT9CB ...

  3. 【.NET】ASP.Net IE10+ SCRIPT:XXX_doPostBack 未定义

    问题描述 GridView中分页控件,点击分页无反应,Linkbutton点击无反应,打开Web控制台,发现如下错误:SCRIPTXXX:_doPostBack 未定义:查询后得知,是由于.NET F ...

  4. Django下orm学习 一对多

    概念说明 ORM:关系对象映射的全称是 Object Relational Mapping, 简称ORM SQLAlchemy: 是Python编程语言下的一款ORM框架,该框架建立在数据库API之上 ...

  5. C++笔记(1)——Anniversary

    世界太喧闹,不如敲代码. 直接上题目: Zhejiang University is about to celebrate her 122th anniversary in 2019. To prep ...

  6. Spring中重要的注解

    现在大部分的Spring项目都会用到注解.使用注解来替换xml,一行简单的注解就可以解决很多事情.但是你真的懂其中的原理吗. 本文翻译于 https://docs.spring.io/spring-f ...

  7. 【VS开发】CTimeSpan类

    CTimeSpan类.        日期和时间类简介        CTime类的对象表示的时间是基于格林威治标准时间(GMT)的.CTimeSpan类的对象表示的是时间间隔.        CTi ...

  8. ASP.NET Core EFCore 之Code First

    1.在.NET Core项目中使用Nuget引用包 Sql Server 请安装 Microsoft.EntityFrameworkCore.SqlServer 2.添加实体类 [Table(&quo ...

  9. [转帖]CentOS 7安装并启动Google浏览器(★firecat亲测有效★)

    CentOS 7安装并启动Google浏览器(★firecat亲测有效★) https://blog.csdn.net/libaineu2004/article/details/82821405 自己 ...

  10. 小记---------spark架构原理&主要组件和进程

    spark的主要组件和进程       driver (进程):     我们编写的spark程序就在driver上,由driver进程执行       master(进程):     主要负责资源的 ...