C program basic

时间:2023-03-09 06:57:17
C program basic

郝人牛语
  入门最基本的方法就是从C语言入手。

  当你成为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);