<一>入门 1.helloworld
以下内容为程序代码: /* first.c: A First Program */ #include <stdio.h> //导入standard IO头文件。 int main() { puts("** Welcome to C++ **"); //puts 读为put string puts("(You'll be glad you came!)"); return 0; } | |
--------OUTPUT----------------------------- ** Welcome to C++ ** (You'll be glad you came! ) -------------------------------------------
注意: 1)导入自己定义的包时要用" "括起来不能用< > 2)可以导入嵌套了头文件的头文件
2.基本输入输出
以下内容为程序代码: /* avg.c: Averages 2 integers */ #include <stdio.h> int main() { /* 必须在头部声明 */ int num1, num2; float sum; puts("Enter the 1st number:" ); scanf("%d",&num1); //输入时的&别忘了 puts("Enter the 2nd number:" ); scanf("%d",&num2); sum = num1 + num2; printf("The average is %f/n", sum/2 ); printf("The average is %.2f/n", sum/2 );//规定小数点后面的显示位数 return 0; } | |
--------OUTPUT----------------------------- Enter the 1st number: 10 Enter the 2nd number: 23 The average is 16.500000 The average is 16.50 -------------------------------------------
注意: 1)标准输入输出: 1>提供控制台,文件,内核I/O这三种形式 2>预定义的输入输出流:stdin(standard input, 键盘),stdout(standard output,显示器),stderr(standard error,显示器) 3>控制台里的功能默认用的stdin和stdout 2)在控制台里通过"<"可以把文件做为输入源,通过">"可以把文件作为输出点,如:dir *.exe>exeback.txt
3.转义符 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号 作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━ 字符 作用 ────────────────────────── /n 换行 /f 清屏并换页 /r 回车 /t Tab符 /xhh 表示一个ASCII码用16进表示, 其中hh是1到2个16进制数 ━━━━━━━━━━━━━━━━━━━━━━━━━━
<二>基本数据类型 1.数字边界 C中整形的数字边界定义在<limits.h>里面,浮点型的在<float.h>里面界定
2.浮点型 1>浮点型的在不同的平台上精度不一样. 2>浮点数离零越近的越准确 ╋━━━╋━━╋━╋╋╋━╋━━╋━━━ - 0 + 3>float型是浮点型里最不准的,下面是测试例子:
以下内容为程序代码:
/* missing.c */ #include <stdio.h> #include <limits.h> main() { float x = ULONG_MAX; /* 4,294,967,295 */ double y = ULONG_MAX; long double z = ULONG_MAX; printf("%f/n%f/n%Lf/n",x,y,z); } | |
==========output============== 4294967296.000000 4294967295.000000 4294967295.000000 ==============================
3.常量 1>例: const int i = 7; 2>C中不能定义常量数组,但是C++中可以
4.宏 1>例: #define SIZE 100 int a[size]; /* "int a[100];" */ 2>C++中不常用 <三>操作符 1.布尔环境中,0会被识别成false,非零识别成true
<四>控制流程 1.scanf的时候在操作符前加空格可以忽略输入时在前加入的任何空格,如scanf(" %c", &really);
<五>复杂数据类型 1.使用struct的例子
以下内容为程序代码:
/* struct.c: Illustrates structures */ #include <stdio.h> #include <string.h> struct Hitter { char last[16]; /* 15 + 1 */ char first[11]; /* 10 + 1 */ int home_runs; }; /* Don’t forget ';' !!! */ int main() { struct Hitter h1 = {"McGwire", "Mark", 70}; struct Hitter h2; strcpy(h2.last, "Sosa"); strcpy(h2.first, "Sammy"); h2.home_runs = h1.home_runs - 4; printf("#1 == {%s, %s, %d}/n", h1.last, h1.first, h1.home_runs); printf("#2 == {%s, %s, %d}/n", h2.last, h2.first, h2.home_runs); return 0; } | | <四>函数 1.void可以用来表示不许输入函数参数 ,如
以下内容为程序代码:
void title(void){ printf("Welcome to …"); } … title(); | | 2.C里面尽量少用全局变量或注意它的命名。它没有this来区别函数内部和外部变量,内外部变量重名时容易被搞混。 3.C中用static表示文件范围内的private作用,用extern表示在其他文件里也可用此变量,相当于public
以下内容为程序代码:
/* file1.c */ int i = 10; /* global */ static int j = 20; /* private */ int get_j(void) { return j; }
| |
以下内容为程序代码:
/* file2.c */ #include <stdio.h> int main() { extern int i; /* extern optional for functions: */ int get_j(void); printf("i == %d/n", ++i); /* i == 11 */ printf("j == %d/n", get_j()); /* j == 20 */ return 0; } | | <五>指针 1.#ifndef. 比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大
量的声明冲突。把头文件的内容都放在#ifndef和#endif中。这时就可以不管你的头文件会被多个文件引用。一般格式是这样的:
#ifndef <标识> #define <标识> ...... ...... #endif
2.指针 1>例子
以下内容为程序代码: /* pptr.c: Illustrates pointers to pointers */ #include <stdio.h> int main() { int i = 7, *ip = &i, **ipp = &ip; //注意给指针赋值的方式,是给地址 printf("Address %p contains %d/n", ip, *ip); printf("Address %p contains %p/n", ipp, *ipp); printf("**ipp == %d/n", **ipp); return 0; } | |
==========output=================== Address 0012FF88 contains 7 Address 0012FF84 contains 0012FF88 **ipp == 7 ===================================
2>只要搞清楚一下几个问题,指针就没有问题了: 1) *p是什么?所指向的内容的值 2) &p是什么?存放本指针的地址 3) p是什么?存放直接所指向内容的地址 4) 其他情况,一对&*可以互相抵消,用(&*)p=()p这个公式进行替换。
3.给指针分配内存 定义在 <stdlib.h>: void* malloc(size_t size); //size_t表示unsigned int void free(void *ptr); //释放内存
4.复习结构体的例子
以下内容为程序代码:
/* structarg.c: Passes a struct by address */ #include <stdio.h> struct Date { int year; int month; int day; }; void printDate(struct Date* p) { printf("%2d/%2d/%02d", p->month, p->day, p->year); } int main() { struct Date d = {98, 10, 2}; printDate(&d); return 0; } | | ==========output=================== 10/ 2/98 ===================================
5.复习typedef的例子
以下内容为程序代码:
struct Foo { int x; int y; }; typedef struct Foo Foo; Foo f; /* struct not needed */
| | 6.指针和数组 1>在一维数组里面可以用指针进行移位读取,路人皆知。 2>在多维数组里,还是要通过一维的方式进行,例子
以下内容为程序代码:
int a[][4] = {{0,1,2,3},{4,5,6,7},{8,9,0,1}}; int (*p)[4] = a; for (i = 0; i < 3; ++i) { int j; for (j = 0; j < 4; ++j) printf("%d ",p[i][j]); putchar('/n'); } | |
7.指针和const const 在*之前表示指针指向的内容不变 const 在*之后表示指针的地址不变 volatile observes the same syntax const char* p1; /* *p1 = ‘c’ illegal; ++p1 OK */ char* const p2; /* *p2 = ‘c’ OK; ++p2 illegal */ const char* const p3; /* no changes at all allowed */
8.指针和函数引用 1>基本例子
以下内容为程序代码:
/* fptr.c */ #include <stdio.h> int main() { int i = 1; int (*fp)(const char*, ...) = printf; //用到了变长参数 fp("i == %d/n", i); /* or (*fp)(" i == ...); */ return 0; } | |
2>高级例子
以下内容为程序代码:
/* menu.c: Illustrates an array of function ptrs */ #include <stdio.h> /* You must provide definitions for these: */ extern void retrieve(void); extern void insert(void); extern void update(void); /* Returns keypress: */ extern int show_menu(void); int main() { int choice; void (*farray[])(void) = {retrieve,insert,update}; for (;;) { choice = show_menu(); if (choice >= 1 && choice <= 3) /* Process request: */ farray[choice-1](); else if (choice == 4) break; } return 0; }
| | |