郝人牛语 当你成为C语言的高手,那么你很容易进入到操作系统的平台里面去;当你进入到操作系统的平台里去实际做程序时,就会懂得进行调试;当你懂得调试的时候,你就会发现能轻而易举地了解整个平台的架构。 这时候,计算机基本上一切都在你的掌握之中了,没有什么东西能逃得出你的手掌心。 ——《编程箴言》 梁肇新 23 置身于一片很白的那种草原上(全下着大雪),然后有个小亭子,然后里边有一个有一个香炉,然后我就披着个斗笠,就在那亭子(棚子),然后就卡阿卡卡卡敲键盘。感觉到很爽……如何能达到这样的感觉,要多敲。刚开始,很痛苦,一敲就会错。学任何课程,刚开始一敲程序就错,经过一个漫长的体力活,敲起来就会很快了(快乐)。让人看见你(感觉你)都很羡慕。敲那么快……(思路那么快)…… |
1.简单语句
C语言的基本结构
# include <stdio.h> int main(void){
printf("hello world");
return 0;
}
进制表示
//# 整数
//# 十进制:
//# 十六进制:0x 0X // 零x
//# 八进制:0 // 零
int x = 314
int x = 0603
int x = 0x603 //# 浮点数
//# float:
//# double:
float x = 3.14F; // 不加F,默认按double处理
float x = 3.14e3; //# 字符:单引号
//# 字符串:双引号
输出函数printf
int i = 10; // 把i的空间存储数字10的二进制代码
printf("%d\n", i); // 以十进制格式,输出i存储的数据
/* 输出控制符
* %d
* %ld
* %c
* %s
* %f
* %lf
* %o 小写‘呕’
* %O 大写‘呕’
* %x 十六进制输出
* %X 字母大写~
* %#x 带前缀~
*/
int i = 314;
printf("number = %d\n", i); printf("%x \t%%x\n", i);
printf("%X \t%%X\n", i);
printf("%#x \t%%#x\n", i); /* 输出内容如下
* [view@file 03]$ ./a.out
* number = 314
* 13a %x
* 13A %X
* 0x13a %#x
*/
输入函数scanf
//# 格式控制符与上边一致
int i; printf("Please input a number: ", &i);
scanf("%d", &i);
printf("number is %d\n", i);
三目运算符
根据表达式(expression)的值,使整个表达式计算为第二个或第三个操作数。
/* a ? b : c
* b,c必须满足以下三个之一:
* 1.数字类型
* 2.兼容的结构体、联合体
* 3.指向相同类型的指针
*/
逗号表达式
用途:前面的表达式产生后边表达式的值,表达式的结果是最后一个表达式的值。
i = (x++, y = x * x, z = x + y, z * z - x * y);
2.流程控制
2.1.选择结构
if语句
// if简单用法
if (x == 10)
puts ("x is 10");
// if...else...
if (x == 10)
puts ("x is 10");
else
puts ("x is not 10");
// if...else if...else
if (x == 1)
puts ("x is 1");
else if (x == 2)
puts ("x is 2");
else
puts ("x is something else");
switch语句
// 检查test-expression表达式(x)
switch (x)
{
case 0:
puts ("x is 0");
break;
case 1:
puts ("x is 1");
break;
default:
puts ("x is something else");
break;
}
2.2.循环语句
while语句
int counter = 0;
while (counter < 10)
printf ("%d ", counter++);
do语句
int x = 0;
do
printf ("%d ", x++);
while (x < 10);
for语句
int x;
for (x = 0; x < 10; x++)
printf ("%d ", x);
3.数组
声明数组
声明数组时,需要指定其数据类型、数组名称、成员个数。(数组长度是个固定值)
int first_array[14];
初始化数组
// 声明时初始化
int first_array[14] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
// 初始化起始3个元素,其他元素为默认值0
int first_array[14] = { 1, 2, 3, 4 };
// 使用赋值运算符赋值
int first_array[10] = { [4] = 5, [5] = 9 }; // 等于下边效果
int second_array[10] = { [0 ... 3] = 0, [4] = 5, [5] = 9, [6 ... 9] = 0 };
// 不直接指定大小,初始化所有成员。数组大小由成员数量决定
int first_array[] { 1, 2, 3, 4, 5, 6};
数组的存储是连续的……
int arraylist[4] = {1, 2, 3, 4}, i;
for(i=0; i<4; i++)
printf("arrayList[%d]: 0x%x\n", i+1, (unsigned int)&(arraylist[i]));
printf("arrayList: 0x%x\n", (unsigned int)arraylist);
上边程序运行后的结果
[view@payqa1 000 C pro]$ ./a.out
arrayList[1]: 0xcaefeb80
arrayList[2]: 0xcaefeb84
arrayList[3]: 0xcaefeb88
arrayList[4]: 0xcaefeb8c
arrayList: 0xcaefeb80
初始化定义一个二维数组
/* 二维数组array[i][j],看作为一个i行j列的矩阵。
*/
int two_dimensions[2][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10} };
例子:定义两个数组,计算数组的长度
// 定义数组、计算长度
int first_array[3][5] = { // 二维数组的长度是……
{ 1, 2, 3, 4, 5 },
{ 0 },
{ 0, 0, 0, 0, 0 }
};
printf("first_array %d\n", sizeof(first_array)/sizeof(first_array[0])); int second_array[5] = { 1, 2, 3, 4, 5 };
printf("second_array %d\n", sizeof(second_array)/sizeof(second_array[0]));
/* 数组长度的计算方法
* sizeof()表示获取到变量的字节值……
*/
// 执行后的结果
first_array 3
second_array 5
4.函数
函数声明时,指定函数名、参数列表、函数返回值。
/* 函数名:length
* 参数列表:只有一个
* 返回值:int
*/
int length(int x);
定义函数
int length(int x) {
int i, y;
i = ( y = x*3 + 4, y + 6 ); return i;
}
【指针】
指针用来保存常量或变量的内存地址。任何数据类型,包括基本类型和自定义类型,都可以创建一个指针,该指针保存该类型实例的内存地址。
# include <stdio.h> void f(int *i) { // 被调函数通过指针修改主调函数的值
*i = 330;
} int main(void) {
int i = 9; f(&i);
printf("i = %d\n", i); return 0;
}
【数组长度】
# include <stdio.h>
int countLength(int *p, int lang) {
int len = 0;
len = (int)lang/sizeof(p[0]); // 数组的总大小 / 元素大小 return len;
} int main(void) {
//int arrayList[5] = { 1, 2, 3, 4, 5 };
int arrayList[2] = { 1, 2 }; // 函数外计算数组总长
printf("in function, length is %d\n.", countLength(arrayList, sizeof(arrayList))); return 0;
}
【数组排序】
# include <stdio.h>
// declear functions.
void sort(int *,int,int);
void display(int *,int,int);
int mk(int *);
// define functions.
void sort(int * p,int len,int k)
{
int t,i,j;
for(i=0;i<len;i++)
for(j=i+1;j<len;j++)
if (k == 0)
if (*(p+i) > *(p+j))
{
t = *(p+i);
*(p+i) = *(p+j);
*(p+j) = t;
}
else if (k == 1)
if (*(p+i) < *(p+j))
{
t = *(p+i);
*(p+i) = *(p+j);
*(p+j) = t;
}
else
printf("The value of \"k\" is error when function \"sort()\" is running.");
return;
}
void display(int * p,int len,int k)
{
if (k == 0)
printf("从小到大排序\n");
else if (k == 1)
printf("从大到小排序\n");
else if (k == 2)
printf("没有排过顺序的数组\n");
int i;
for (i=0;i<len;i++)
{
printf("array[%d] = %d\t",i,*(p+i));
if (i == (len-1))
printf("\n");
}
return;
}
int mk(int * p)
{
int len,i;
printf("输入需要产生的数组元素的个数:");
scanf("%d",&len);
for (i=0;i<len;i++)
{
printf("请输入第%d个元素的数值:",i+1);
scanf("%d",&( *(p+i) ));
}
;
return len;
}
int main(void)
{
//int a[10] = {33,234,227,36,1,22,13,8,9,7},i,k=2;
int * a;
int lang,k = 2;
lang = mk(a);
display(a,lang,k);
k = 0;
sort(a,lang,k);
display(a,lang,k);
k = 1;
sort(a,lang,k);
display(a,lang,k);
return 0;
}
5.结构体
定义结构体,使用关键字 struct 跟上成员声明,放在一对大括号内、以分号结尾。
struct memberMem {
char hostname[50];
char ipAddress[50];
char position[30];
float total, used;
float cache, buffer;
float swapIn, swapOut;
}; // 末尾有个分号
声明结构体变量
struct memberMem back, app47, app160, task;
结构体变量赋值
back.total = 8.0F;
back.used = 1.23F;
printf("memory total is %f, used is %f.\n", back.total, back.used);