重学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

如果有GCC

Windows 上的安装

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

  1. 访问官网
http://www.mingw.org/
  1. 点击download

  2. 点击logo

image-20201111083930032

  1. 点击logo进行下载

image-20201111084748211

  1. 添加到环境变量

image-20201111084918410

当然,你也可以使用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 中,有两种简单的定义常量的方式:

  1. 使用 #define 预处理器。
  2. 使用 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

image-20201111100240179

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;
}

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,如下所示:

数据类型初始化默认值
int0
char‘\0’
float0
double0
pointerNULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。

作用域

  • 全局变量
  • 局部变量
  • 形式参数

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];

C 中的二维数组

因此,数组中的每个元素是使用形式为 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;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部