c语言入门教程 第12讲 结构体

结构体

可以将多种数据类型组合起来的结构

声明方式

struct 结构体名称{
成员1的类型  成员1的名称;
成员2的类型 成员2的名称;
……
成员3的类型  成员3的名称;
} ;

举例:

struct time{
	int hour;
	int minute;
	int second;
} ;

注意不要漏掉了最后的分号

结构体的定义

1)常规定义

struct time{
	int hour;
	int minute;
	int second;
} ;

struct time t;

如何定义一个int类型的变量?

	int number;

实际上来说,结构体变量的定义是跟普通数据类型类似的。
如,以上两个变量的声明区别,仅在于,一个的类型是struct time 另一个的类型是int

2)声明的同时定义

struct student{
	char name[256];
	char sex[2];
	int age;
	int grade;
} Alan, Tom ;

3)使用结构体作为成员

struct DATE{
	int year;
	int month;
	int day;
} ;

struct person{
	char name[256];
	struct DATE birthday;
} ;

struct time t;

4)匿名结构体

struct {
	int number;
	char name[256];
	char sex[2];
	int age;
	int grade;
} Alan, Tom ;

结构体的引用与初始化

使用“.”成员运算符来获取结构体中的成员

#include<stdio.h>#include<string.h>

struct student{
	int number;
	char name[256];
	char sex[2];
	int age;
	int grade;
} ;

main()
{
	struct student alan;
	alan.number = 001;
	strcpy(alan.name, "Allan");
	strcpy(alan.sex, "男");
	alan.age = 18;
	alan.grade = 3;

	printf("学号:%d n姓名: %s n性别:%s n年龄:%dn年级:%dn", 
		   alan.number, alan.name, alan.sex, alan.age, alan.grade);
}

结构体数组

结构体数组的使用:

#include<stdio.h>
#include<string.h>

struct student{
	int number;
	char name[256];
	int age;
} ;

main()
{
	struct student class_02[5];
	int k;

	for(k=0; k < 5; k++)
	{
		printf("Please input number:n");
		scanf("%d", &class_02[k] .number);
		printf("Please input name:n");
		scanf("%s", class_02[k] .name);

		printf("Please input age:n");
		scanf("%d", &class_02[k] .age);

		printf("n");
	}

	printf("NumtNametagen");

	for(k=0; k < 5; k++)
	{
		printf("%dt", class_02[k] .number);
		printf("%st", class_02[k] .name);
		printf("%dn", class_02[k] .age);
	}
}
#include<stdio.h>

struct student{
	int number;
	char name[256];
	char sex[6];
	int age;
	int grade;
} ;

main()
{
	struct student class1[5] = {
		{ 01, "Alan", "man", 16, 12 },
		{ 02, "Bob", "man", 18, 12 },
		{ 03, "Cici", "woman", 16, 12 },
		{ 04, "David", "man", 11, 12 },
		{ 05, "Elis", "woman", 16, 12 },
	};
	for(k = 0; k < 5; k++)
	{
		printf("nstudy number: %d nname: %s nsex: %s nage: %dn grade: %dn" ,class1[k].number,
		class1[k].name,
		class1[k].sex,
		class1[k].age,
		class1[k].grade);
	}
}

结构体指针

使用分量运算符“->”来获取成员

#include<stdio.h>

struct DATE{
	int year;
	int month;
	int day;
} *date ;

main()
{
	date->year = 2012;
	printf("%d", date->year);
}

#include<stdio.h>

struct DATE{
	int year;
	int month;
	int day;
} date = { 2012, 11, 27 }, *d ;

main()
{
	d = &date;
	printf("%d", d->year);
}

用于函数的参数以及返回值:

#include<stdio.h>

struct time add(struct time now, struct time pass);

struct time{
	int hour;
	int min;
} ;

main()
{
	struct time now = { 3, 55 }, pass = { 1, 33 }, result;
	result = add(now, pass);
	printf("%d:%dn", result.hour, result.min);
}

struct time add(struct time now, struct time pass)
{
	struct time rel;
	rel.hour = now.hour + pass.hour + (now.min + pass.min)/60 ;
	rel.min = (now.min + pass.min)%60;
	return rel;
}
Advertisements

c语言入门教程 第11讲 调试以及资料收集

视频地址

A站:http://www.acfun.tv/v/ac479828
B站:http://www.bilibili.tv/video/av400594/
新浪:http://video.sina.com.cn/v/b/90825190-2731231323.html

如何进行调试

1)注释调试
2)printf打印调试
3)根据报错信息找错
4)使用调试工具
5)求助网络

查询文档

1.右键查看定义
2.度娘谷歌
3.手册
4.自己撰写自己的文档

如何查看函数以及变量的引用?
使用工具自带的功能。

如何查看函数的使用方法?
度娘谷歌等,vs下可按F1查看微软的帮助文档

基础的东西学完了如果知道下一步学什么?
通过相关的书籍、论坛帖子或者博客博文

提高自己的查找能力

查询:
http://www.baidu.com/               度娘
http://www.google.com.hk/        谷歌
http://msdn.microsoft.com/        MSDN

百度知道、各大博客论坛的搜索功能

资料网站:
http://www.verycd.com                电驴
http://www.51cto.com                  51CTO
http://club.topsage.com/               大家网
http://www.oschina.net/             开源中国

论坛:
http://bbs.chinaunix.net/            ChinaUnix论坛
http://bbs.51cto.com/                51cto论坛
http://www.itpub.net/                 itpub论坛
http://bbs.pediy.com/                 看雪学院
http://www.cctry.com/               vc驿站
http://bbs.fishc.com/                  鱼C论坛
http://bbs.bccn.net/                   编程论坛
http://www.rupeng.com/                   如鹏网

技术博客聚集区:
http://blogs.msdn.com/              MSDN博客
http://www.cnblogs.com/           博客园
http://blog.51cto.com/               51cto博客
http://www.iteye.com/blogs        iteye博客
http://space.itpub.net/                itpub博客
http://wo.zdnet.com.cn/             ZDNet技术社区
http://www.oschina.net/blog             开源中国

英文网站:
http://sourceforge.net/
http://www.cplusplus.com
http://www.codeguru.com/
http://www.codeproject.com/

书籍教程推荐

《C语言自学教程》郝斌
《数据结构自学视频》郝斌
《C Primer Plus》中文版
《C语言程序设计 现代方法》
《狂人C-程序员入门必备》
《C和指针》人民邮电出版社
《C语言实例解析精粹》曹衍龙

如何学习?

1.理解编程过程中的知识点
2.使用自己理解知识去编程、在编程的过程中验证所学
3.尝试去寻找题目编写
4.在调试中寻找自己的不足
5.阅读好的书籍,查漏补缺(可搜索笔记)

小结

1.调试的基本方法
2.去哪里找资料?
3.如何学习比较好?

如果有发现不错的网站或者资料可以向博主推荐
特别是各个博客区中比较好的博客
后期还会再排版,汇总推荐

C/C++ Beginner 一群 10191598
C/C++ Beginner 二群 163859361 (感谢One day捐助)
C/C++ Beginner 三群 10366953 (感谢Vol jun捐助)

c语言入门教程 第12讲 结构体

c语言入门教程 第10讲 字符串处理

字符与字符串的区别

1)符号

字符	' ' 单引号
字符串	" " 双引号

2)内容

字符	单个字符
字符串	多个字符

3)输入输出格式

字符	%c
字符串	%s

4)标识

字符串	'\0'做结尾

字符串的本质是?

字符串本质上就是一个字符数组

“hello world” 这样的字符串,就是包含其中各个元素的,并且结尾为”的一个一维字符数组

如:

char hi[12]={'H','e','l','l','o',' ','w','o','r','l','d','\0'};

因为一个字符串要有”作为结尾
所以字符数组的长度要比本身字符数目多一个

如上例中,字符串有11个,但是字符数组长度要达到12

字符串的定义与初始化

字符串面量:
“Hello world” 注意:字面量(双引号引起来的)是常量

区别举例:

"Alan"  常量
char name[20] = "Jack";   // "Jack"是字面量 是常量  name是字符数组, 是变量

注:
常量不能被赋值,如讲2的值赋给1这样:

1 = 2 是不行的,1是常量不能被赋值

“string” 这样的字符串也是不能被赋值的:

"string" = "Hello Jack" 这样是错的

字符数组

1)数组形式

char hi[3]={'H', 'i','\0'};
char hello[]={'H','e','l','l','o',' ','w','o','r','l','d','\0'};

2)直接赋首地址

char shool[20] = "第一中学";

3)省略长度

char name1[] = "Alan";
char name2[] = { "Alan" };

字符指针

char *name3  = "Alan";
char *s = "第一中学";

思考:
指针能不能直接赋给数组?

字符串的遍历

char hi[] = "I am happy" ;

1.for循环遍历

for(i=0; i<11; i++)
{
    printf("%c", hi);
}

2.直接输出

printf(hi);

3.字符串格式(%s)输出

printf("%s", hi);

字符串数组(二维字符数组)

常见姓名:

char name1[] = "张三";
char name2[] = "李四";
char name3[] = "王五";

存储多个字符串:

1)二维数组

char name[][256] = { "张三", "李四", "王五" };

2)一维指针数组

char *name[] = { "张三", "李四", "王五" };

对于printf,最重要的是?

对于printf和scanf来说,字符串最重要的是其起始地址

如打印一个字符串:

char *text = "hey gays!";

1) pirntf(text);
2) printf("%s", text);

对于printf这个函数而言,只要知道字符串开头的地址,
那么就一直打印下去,一直到碰到”的时候停止

如:

printf("Hello \0 world"); \ hello 

常见的字符串操作函数

stdio.h

输入:scanf()、gets()、getchar()
输出:printf()、puts()、putchar()

string.h

连接:strcat()
拷贝:strcpy()
比较:strcmp()
获取长度:strlen()
大小写转换:strupr()、strlwr()
拼接字符串:sprintf()

示例:

#include<stdio.h>
#include<string.h>

main()
{
    char *hi = "hello", s2 = "Alice";
    char str[256], *pstr;
    printf("%s n", strcat(hi, " world"));//连接
    printf("%s n", strcpy(str, "come on")); //拷贝
    printf("%s n", strcmp("你好", "你好")); //比较
    printf("%s n", strlen(str)); //获取长度
    printf("%s n", strupr(str)); //转成大写
}

学会查询文档:

1.右键查看定义
2.度娘谷歌
3.手册
4.自己撰写自己的文档

关于函数传参数

对于:int add(int a, int b);
调用:add(5, 10);

add函数中参数初始化时,相当于:
int a = 5;  int b = 10

对于:int swap(int *x, int *y);
调用:swap(&i, &j);

swap函数中参数初始化时 ,相当与:
int *x = &i;  int *y = &j;

strlen()

#include<stdio.h>
int mylength(char *aim);

int main()
{
    char *str1 = "hello ";
    printf("%dn", mylength(str1));
}

int mylength(char *aim)
{
    int count=0;
    while(*aim++){
    count++;
    }
    return count;
}

strcat()

#include<stdio.h>
char * mycat(char *dest, char *src);

int main()
{
	char str1[20] = "hello "; // 要拷贝的话需要有足够的内存
	char *str2 = "world";
	printf("%sn", mycat(str1, str2));
}

char *mycat(char *dest, const char *src)
{
	char *address = dest;

	while (*++dest) // 加到 '\0' 马上停止
		;

	while (*dest++ = *src++)
		;

	return address;
}

(感谢 灬蕾依丽雅 君的提醒, 该函数已修正)

本讲小结

一、字符串的本质,与字符的区别
1)本质上是结尾为”字符数组
2)单双引号,书写区别
3)输出格式”%c”和”%s”

二、字符串的定义与初始化
1)字面量
2)数组
3)指针

三、常见的字符串操作,及其操作的实现
连接(strcat)、拷贝(strcpy)、比较(strcmp)、获取长度(strlen)、大小写转换(strupr、strlwr)、拼接字符串(sprintf)

以上部分函数的实现跨越在博主的 string.h 的实现中找到 博主的 C标准库

课后作业

通过自己查找参考,理解并实现以上常见的字符串操作
注:sprintf()只要掌握,不要求实现

c语言入门教程 第11讲 调试以及资料收集

C语言入门教程 第9讲 指针与数组

上节课后作业

现在有一个数组,存储的是一个同学的期中考试成绩。

int score[8] = { 75, 86, 70, 88, 62, 87, 69, 77 };

那么现在我们要做的事情是:

1)求总分,求平均分

2)用指针遍历数组,求最大值和最小值

附加题:
用一个二维数组存储八门课的名称,例如:
char course[8][256] = { “chinese”, “English” … }
再用二维数组,存储多个人的成绩,用指针遍历求出每门课的平均分

#include<stdio.h>
#include<stdlib.h>

int main()
{
    // 现在有一个数组,存储的是一个同学的期中考试成绩。
    char course[8][256] = { "语文", "数学", "英语", "物理", "化学", "生物", "历史", "地理" };
    char name[5][256] = {"Alan", "Bob", "Clain", "David", "Elis"};
    int score[5][8];
    int sum[5] = {0};
    float avg[8] = {0};

    int i,j;

    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 8; j++)
        {
            score[i][j] = rand() % 100;
        }
    }


    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 8; j++)
        {
            sum[i] += score[i][j];
            avg[j] += score[i][j];
        }
    }


    for(i = 0; i < 8; i++)
    {
        printf("t%s", course[i]);
    }

    printf("t总分");

    for(i = 0; i < 5; i++)
    {
        printf("n%s", name[i]);
        for(j = 0; j < 8; j++)
        {
            printf("t %d",score[i][j]);
        }
        printf("t%d", sum[i]);
    }

    printf("n平均分");

    for(j = 0; j < 8; j++)
    {
        printf("t%.1f", avg[j] / 8.0);
    }

    printf("n");
    return 0;
} 

字符数组与指针

字符串 == 字符数组+”结尾

// 对于字符串"Hello world"相当于如下的字符数组 
char hi[] = {'h','e','l','l','o',' ','w','o','r','l','d', '\0'};

printf("%c n", hi[1]);  // e
printf("%c n", "Hello world"[1]); // e

因为字符串相当于字符数组,所以”Hello world”[1]越数组hi[1]的值一样。

数组名 == 起始地址

学会自己研究各种变量

1)如何研究?
学会善用printf

2)怎么知道变量是不是一个指针(或地址)
学会使用*

int a[5] = { 1, 3, 5 };

printf("%d",    a);   // 1638196
printf("%d",   *a);   // 1
printf("%d", *(a+1)); // 3

运行成功,表示这个变量的类型即使不是指针,也是一个地址

常见用法:

int a[5] = { 1, 3, 5 };
int *p;
p = a;
printf("%d", *(p+1)); // 3
printf("%d", *(p+2)); // 5

“Hello world”究竟是?

有了上面的两个结论之后,我就可以继续使用printf来探讨更多的东西。
比如”Hello world”这个字符串所代表的意义。
我们已经知道这个字符串实际上就是一个字符数组,通过”Hello world”[1]甚至可以取到其中的值。那么对于这样一个字符串而言它的数组名(地址)是什么?
运用以上相同的方法可以看到:

printf("%d",   "Hello world" );   // 4337572
printf("%d", *("Hello world"));   // 72
printf("%c", *("Hello world"));   // H
printf("%c", *("Hello world"+1)); // e

多个名字如何用char数组存储?

多个人的名字:

char a[256] = "Alan";
char b[256] = "Bob";
char c[256] = "Cici";

现在要用数组来存储这三个人的名字。
也就是要用一个数组来存储三个数组,数组的每一个元素是一个数组:

char name[3][256] = {"Alan", "Bob", "Cici" };

如何使用指针遍历

int arr[8] = { 1, 1, 2, 3, 5, 8, 13, 21 };
int i;
int *p;
// 普通遍历
for(i = 0; i < 8; i++)
{
    printf("%d ", arr[i]);
}
// 指针遍历
for(p = &(arr[0]); p <= &(arr[7]); p++)
{
    printf("%d ", *p);
}
// 数组名获取指针地址
for(p = arr; p < (arr+8); p++)
{
    printf("%d ", *p);
}

本讲小结

1)如何使用指针遍历数组?
使用循环

2)如何研究各种变量?
尝试使用printf

3)数组与指针什么关系?
数组名就是一个地址,指向这个数据的开端

int a[] = {1, 3, 5, 7, 9};
int *p = a;

printf( "%d n",     *p == a[0] ); // 1
printf( "%d n", *(p+1) == a[1] ); // 1
printf( "%d n", *(p+2) == a[2] ); // 1

可以知道:

*(p+n) == a[n]

引申推导:

a[n] = *(p+n)
     = *(n+p)
     = n[a]

即:

a[n] = n[a]

可以这样理解,下标对于数组来说,就是相对于起始地址的一个偏移量。

c语言入门教程 第10讲 字符串处理

C语言入门教程 第8讲 指针的基本概念

“&” 与 “*”

取地址与指针运算符(取值运算)

“&” 对变量进行取地址运算:
&(变量名) => 获取变量的地址
如:

int i;
printf("%d", &i);  // 打印出地址

如:

scanf("%d", &i);  // 传入一个地址

而“*”作为指针运算符,当然我更乐意称它为取值运算:
*(变量名) => 将变量当做地址,到相应的地址取值

思考:

*(&(变量名)) 是什么?

int i = 6;
printf( "%d", *(&i) );

什么是指针变量?

指针变量就是用来存储地址的变量

任何变量都它存储的地址,这个地址是随机分配的。如:

int i = 10;

i 这个变量的地址,是系统随机分配的。而我们对其进行 “&” 运算之后就可以得到它的地址,并且 (&i) 这个表达式就是一个指向i的指针。

这个指针所指向的地址中存储的值则是:
*(&i) ==> i

声明与初始化

声明方式:

指针类型 * 指针变量名;

例如:

int *p1;
char *name;

初始化:

1)普通写法

int x; 
int *p;
p = &x;

2)省略写法

int x;
int *p = &x;

上述两种写法都声明了一个指针p,并且这个指针是指向变量 x 的
对于变量 x, (&x) 则是一个指向x的指针 (指针存放的就是地址, 而&运算得到的地址表达式也就是指向其本身的指针)
并且通过 *(指针) 取到这个地址中的值

常见错误

请不要人为的指派地址:

// 错误1
int *p;
p = 10010;   

// 错误2
int x = 20;
printf("%d", &(*x) );

// 正确形式:
int i, *p, *t;
p = &i;
t = p;

只能通过已有的变量传递

经典的错误 – Scanf函数

int score;
printf("请输入你的分数:n");
scanf("%d", score);

上述代码在编译时没有错,运行时会出现严重的错误

错误原因:
scanf() 函数后面的参数应该传入的是指针,而这里直接把 score 的值传了进去。

正确应该是:

int score;
printf("请输入你的分数:n");
scanf("%d", &score);

Swap交换两个变量

与第五讲中不同的是,使用指针到某个地址中取访问它的值,就没有了作用域的限制

#include<stdio.h>

void swap(int *x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
    printf("x=%d, y=%d n", *x, *y);
}

main()
{
    int i = 13, j = 45;
    swap(&i, &j);
    printf("i=%d, j=%dn", i, j);
}

本讲小结

1) “&” 和 “*”

取地址与取值运算符 ==> 互为逆运算

2)指针变量是什么?

指针变量就是用来存储地址的变量
如,&i 就是一个指向变量i 的指针
通过*(指针)取值

3)声明

int *p1;
char *name;

4)初始化

普通写法

int x; 
int *p;
p = &x;

省略写法

int x;
int *p = &x;

5)指针的作用
引用类型,传递地址,减少内存消耗

课后作业

现在有一个数组,存储的是一个同学的期中考试成绩。

int score[8] = { 75, 86, 70, 88, 62, 87, 69, 77 };

那么现在我们要做的事情是:

1)求总分,求平均分

2)用指针遍历数组,求最大值和最小值

附加题:
用一个二维数组存储八门课的名称,例如:

char course[8][256] = { "chinese", "English", ... }

再用二维数组,存储多个人的成绩,用指针遍历求出每门课的平均分

C语言入门教程 第9讲 指针与数组

c语言入门教程 第7讲 数组

一维数组

同类元素的集合,称为数组

定义方式

数据类型 数组名 [常量表达式]; 举例:

int 	a[5];
float	score[8];
double	d[10];
char	name[256];

初始化


int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

int b[5] = { 1, 2, 3, 4, 5 };    // 省略写法

float score[8] = { 1.0, 1.2 };   // 后面未赋值则为零

char name[] = "Alan";            // 省略写法,单独定义时必须声明大小

一维数组的下标

数组的下标实际上是关于数组第一个元素的偏移量 比如,定义一个数组array[5]。它的第一个元素跟数组的第一个元素的偏移量为0 所以,数组的第一个元素应该是array[0] 数组的第二个元素跟数组的第一个元素偏移量为1 所以,数组的第二个元素应该是array[1] 以此类推,数组的第五个元素与第一个元素的偏移量为4 所以,数组array的第五个元素应该是array[4] 结论: 一位数组最后一个元素的下标为 (长度 – 1) 并且对于一个数组它的第几个元素的下标就是几减一

循环初始化:


#include <stdio.h>

main()
{
    int a[10], b[3], i;

    // 有规律的循环赋值
    for( i = 0; i < 10; i++ )
    {
        a[i] = i;
    }

    // 多次输入赋值
    for( i = 0; i < 3; i++ )
    {
        scanf("%d", b[i]);
    }
}

注意如果一次输入多个数用scanf循环去接收的话,空格也会被当做字符(或数值)来保存

一维数组遍历

#include <stdio.h>

main()
{
    int a[8] = { 1, 1, 2, 3, 5, 8, 13, 21 };
    int i;

    for( i = 0; i < 8; i++ )
    {
        printf("%d ", a[i]);
    }
}

一维数组应用示例

#include <stdio.h>

main()
{
    int a[8] = { 80, 90, 85, 84, 70, 76, 75, 83 };
    int i, max = 0, min = 100;

    for( i = 0; i < 8; i++ )
    {
        if( a[i] > max )
        {
            max = a[i];
        }else if( a[i] < min )
        {
            min = a[i];
        }
    }
    printf("最高分为:%d 最低分为:%d", max, min);
}

二维数组

定义

//数据类型 数组名 [常量表达式][常量表达式];

int 	a[56][3];
char	name[5][256];

初始化


// 1)分段赋值
int grade[2][3] = { {80,75,92}, {61,65,71} };

// 2)连续赋值
int a[2][3] = { 80, 75, 92, 61, 65, 71 };

// 3)连续省略赋值
int a[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

二维数组的遍历


#include <stdio.h>

int main()
{
    int grade[4][3] = {82,77,76,90,87,56,87,48,75,86,86,66};
    int i, j;
    for( i = 0; i < 4; i++ )
    {
        for( j = 0; j < 3; j++ )
        {
            if( grade[i][j] < 60 )
            {
                printf("第%d位学生不及格");
                continue;
            }
        }
    }
}

本讲小结

一、数组由类型说明符、数组名、数组长度(数组的个数)三部分组成
int a[10]; float money[2][3]; // 注意下标

二、数组的初始化
1)声明之后一个个赋值
2)省略形式赋值: char name[] = “Sam”;

三、数组的遍历
通过while、do while、for等循环遍历

四、数组的作用
数组是程序设计中最常用的数据结构,属于构造类型。它将相同类型的数据连续组合在一起,简化了命名和赋值过程。相较单一的数据类型,能够更快更方便的处理更多的数据。

C语言入门教程 第8讲 指针的基本概念

c语言编译器 CL.exe

下载地址CL.7z
版权问题:
仅供学习交流,请于24小时内删除,本人不承担版权问题…

基本使用:

1.解压缩,例如解压缩到E盘根目录下

2.打开cmd命令行界面(快捷方式win+R输入cmd回车)
cd命令切换到CL/Bin目录下

cd E: 
cd /CL/Bin

3.可以用任何编辑器在这个目录下编写.程序,如notepad++或者系统自带的记事本.
比如在E:/CL/Bin目录下新建一个hello.c其中输入

#include<stdio.h>
main()
{
	printf("Hello world");
}

然后
在cmd中,这样来编译和链接:

CL.exe hello.c

不过由于环境尚未配置,所以会提示找不到include的stdio.h文件
这个时候将#include改成#include “../include/stdio.h”用相对路径去找即可
exe程序会直接生成在当前目录

配置使用(更改环境变量):

include配置

在环境变量新建INCLUDE
路径为E:/CL/include; (具体看你自己的路径)

lib配置

在环境变量新建LIB
路径为E:/CL/Bin; (本人直接将其放在了Bin目录下,你也可以抠出来新建一个Lib目录保存)

设置path路径

最后在path中新添加一个,路径的最前或最后加上你的Bin目录路径 (注意不要动path里面其他的路径,否则有惊喜)
路径为E:/CL/Bin;

这样配置完了之后就可以直接使用cmd在任意路径使用基础的c语言编译器

例如:
在C盘根目录下写一个test.c程序,然后打开cmd

cd C:
CL.exe test.c

即可编译

如果你心情好的话,还可以把CL.exe重命名
比如改成gcc.exe

调用的时候直接(.exe可以省略)

gcc hello.c