重学C语言_数据结构与基础语法
c语言标准
2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会(ISO/IEC JTC1/SC22/WG14)正式发布了C11标准。
C11标准是C语言标准的第三版,前一个标准版本是C99标准。
目前程序设计学习使用最多的标准是C99,它是1999年发布的。
环境安装
要想运行C语言程序,电脑里面必须得有GCC,也就是C语言的编译器。
- 验证有没有gcc
- cmd里面敲gcc -v

Windows 上的安装
为了在 Windows 上安装 GCC,您需要安装 MinGW。为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinGW 下载页面,下载最新版本的 MinGW 安装程序,命名格式为 MinGW-.exe。
- 访问官网
http://www.mingw.org/
-
点击download
-
点击logo

- 点击logo进行下载

- 添加到环境变量

当然,你也可以使用IDE里面自带的编译器,一般codeblocks等编辑器都自带MinGW。
Hello world!
#include
int main()
{/* 我的第一个 C 程序 文件名 hello.c */printf("Hello, World! \n");return 0;
}
编译运行这一段代码。
gcc hello.c
它会自动生成一个a.exe文件 (LINUX平台为 a.out)
通过 ./a.exe 就可以执行。
注释
// 单行注释
/** 多行注释*/
标识符
用来标识变量、函数。
- 由字母、数字、下划线组成
- 数字不能打头阵
- 不能出现特殊符号($、@ 不能出现)
- 区分大小写
C数据类型
整数类型
char、int、short、long、long long都是整数类型
他们都可以有unsigned的前缀。(unsigned 无符号)
char 的值范围 -128到127 (-128的二进制 10000000)
unsigned char 的值范围是 0 到 255
浮点数类型
double 和 float
定义常量
在 C 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
#define identifier value
or
const type variable = value;
// const int
C语言修饰符
auto
所有局部变量的默认值
{int variable;等价于auto int variable;
}
static
可以修饰局部变量 和 全局变量。
c 语言中,把变量定义在 大括号外面就是全局变量。
static int count = 10;
等价于
int count = 10;void main(){// do something
}
extern
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
详细见菜鸟教程
c - if 判断
定义:C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。

C - 循环
有while,for,do while循环
break 结束循环
continue 停止本次循环,执行下一步
C - 函数
语法:
return_type function_name( parameter list ) {body of the function }
- **返回类型:**一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
- **函数名称:**这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- **参数:**参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
- **函数主体:**函数主体包含一组定义函数执行任务的语句。
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
函数参数:
- 传值 (不会修改原来的值)
- 传地址
函数声明:
- 如果调用外部函数,必须得提前声明
- 如果main在调用的函数前面,必须得提前声明
函数的形参名不重要,所以函数声明时可以忽略。
#include
#include
int sum(int,int);
// int sum(int a,int b); // 这两种都可以int main()
{int x=3,y=5;printf("%d",sum(x,y));return 0;
}int sum(int a,int b){return a+b;
}
当形参和全局变量同名的时候,形参的值在函数体内部会覆盖掉全局变量。
传递数组给函数作为参数
方式 1
形式参数是一个指针:
void myFunction(int *param) { . . . }
方式 2
形式参数是一个已定义大小的数组:
void myFunction(int param[10]) { . . . }
方式 3
形式参数是一个未定义大小的数组:
void myFunction(int param[]) { . . . }
建议采用方式1或者3
数组作为函数的返回值
C 语言不允许返回一个完整的数组作为函数的参数。
但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
// int[] getArr() //这种语法是错误的int * getArr( )
{static int r[10] = {1,2,3};; // 必须使用static来修饰,否则报错return r;
}
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,如下所示:
| 数据类型 | 初始化默认值 |
|---|---|
| int | 0 |
| char | ‘\0’ |
| float | 0 |
| double | 0 |
| pointer | NULL |
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。
作用域
- 全局变量
- 局部变量
- 形式参数
c语言中是块级作用域,即变量只服务于大括号内部。
{int a; // 外面访问不到这个
}
函数体定义的形参等价于函数体内部定义的局部变量。
void func(int x){// 等价于函数体里面写 int x;
}
当局部变量和全局变量重名的时候,优先获取的是局部变量的值。
C - 数组
定义: 数组是用来存储一系列数据,它是一系列相同类型的变量。
语法:type arrayName [ arraySize ];
初始化数组
在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
如果您只赋值,其中一部分,那么剩余的值将采用默认值。
int arr[5] = {1,2,3}; // [1,2,3,0,0] int的默认值是0
获取数组的Length
int arr[5] = {1,2,3};
int len = sizeof(arr) / sizeof(arr[0]); // 5
使用size运算符通过计算就可以获得数组的长度,但是这还是很不方便。
可以进一步使用宏定义。
#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}
int main (){int arr[5] = {1,2,3};int len;GET_ARRAY_LEN(arr,len); // 此时len = 5
}
千万不要把sizeof(arr) / sizeof(arr[0])封装到函数里面,你获取的长度将永远是1。
深坑,请勿踩雷!~
二维数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:
type arrayName [ x ][ y ];
其中,type 可以是任意有效的 C 数据类型,arrayName 是一个有效的 C 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:
int x[3][4];

因此,数组中的每个元素是使用形式为 a[ i , j ] 的元素名称来标识的,其中 a 是数组名称,i 和 j 是唯一标识 a 中每个元素的下标。
初始化二维数组
多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。
int a[3][4] = { {0, 1, 2, 3} , /* 初始化索引号为 0 的行 */{4, 5, 6, 7} , /* 初始化索引号为 1 的行 */{8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};
内部嵌套的括号是可选的,下面的初始化与上面是等同的:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
访问二维数组元素
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:
int val = a[2][3];
C - 枚举
语法:enum 枚举名 {枚举元素1,枚举元素2,……};
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};
这样看起来是不是更简洁了。
**注意:**第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
可以在定义枚举类型时改变枚举元素的值:
enum season {spring, summer=3, autumn, winter};
没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5
枚举变量的定义 - 实例化
前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。
我们可以通过以下三种方式来定义枚举变量
1、先定义枚举类型,再定义枚举变量
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
2、定义枚举类型的同时定义枚举变量
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
3、省略枚举名称,直接定义枚举变量
enum
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
C - 指针
定义:指针是一个变量,其值为另一个变量的地址。
语法: type * variable
备注:这个*是声明指针运算符,不是乘号,更不是对地址取值
#include int main ()
{int var = 20; /* 实际变量的声明 */int *ip; /* 指针变量的声明 */ip = &var; /* 在指针变量中存储 var 的地址 */printf("var 变量的地址: %p\n", &var );/* 在指针变量中存储的地址 */printf("ip 变量存储的地址: %p\n", ip );/* 使用指针访问值 */printf("*ip 变量的值: %d\n", *ip );return 0;
}
空指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。
#define NULL 0 // NULL 指针是一个定义在标准库中的值为零的常量。
实例:
#include
int main () { int *ptr = NULL; printf("ptr 的地址是 %p\n", ptr ); return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
ptr 的地址是 0x0
取值和取地址运算符
// * 取值运算符
// & 取地址运算符int main()
{int a = 1;int *p;p = &a;printf("%d",*p); // 1return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
