%p —— 函数、指针的地址。
数组
int a[4] = {2,5}; //a[2],a[3]值为0
定义或声明时,[]里面可以是常量,绝对不能是变量。
计算数组中元素的个数:int a[]={123,321,2123,4,12};
int count = sizeof(a)/sizeof(int);
字符串初始化:1. char a[3] = {'w','w','\0'};
2. char a[3] = "ww";或 char a[] = "ww";
3. char *d = "ww";
4. char b[3]; b[0]='w'; b[1]='w'; b[2]='\0';
strlen():计算字符串的字符个数(不包括‘\0’)。引用<string.h>头文件。
strlen()与sizeof():strlen()求字符个数,
sizeof()求整体所占空间(包括'\0’,指针的话是指指针变量的大小)
字符串指针用sizeof()返回指针变量大小,4字节(32位),8字节(64位)。字符串数组返回元素个数。
字符串指针用strlen()返回字符个数。
函数
每个函数都应该独立定义,不能嵌套定义。
常用函数:rand():产生一个(0~RAND_MAX)之间的随机数,包含<stdlib.h>
嵌套调用:A函数调用B函数。
递归调用:当前函数调用自己。使用return关键字跳出递归。
C语言中,只有后面定义的函数才能调用前面定义过的函数。
预处理指令:以#开头,结尾不用分号。
主要有:宏定义、文件包含、条件编译。
宏定义:1. 不带参数的宏定义:#define 宏名 宏内容
终止宏定义的作用域 #undef 宏名
2. 带参数的宏定义:#define 宏名(参数列表) 字符串
#define average(a,b) (a+b)/2
3. 宏定义与函数的区别:
宏定义不涉及参数类型匹配、参数传递、返回值问题。
函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行,
所以带参数的宏比函数运行效率更高。
文件包含:#include的本质是将文件的内容拷贝到当前文件。
(#include "sum.txt"、#include "sum.c"也可,只是单纯的拷贝)
#include <xx.h>直接在系统目录下查找文件,库文件使用这种方式。
#include "xx.h"现在当前编译目录下查找,没有再到系统目录下查找。
include 最好包含的是头文件(里面是声明),若是包含.c文件,在连接时容易出现重复定义。
即拷贝过来(include)的生成的目标文件和那个.c文件生成的目标文件连接时会重复定义。
条件编译:#if define()和#if !define()。
#ifdef和#ifndef
同时编译多个文件指令: cc -c one.c two.c ...
链接多个目标文件: cc -o a.out one.o two.o …
多个文件编译链接:cc one.c two.c… //默认生成a.out可执行文件
若宏MAX不等于10,代码中的乱码不会被编译,不会出错。
注意下图条件预处理后面可跟真假值。