C语言初篇

初识C语言

一、概念

简单来说,就是一种编程语言,广泛应用于底层开发,C语言是一门面向过程的计算机编程语言。

二、第一个C语言程序

其中一个工程只能有一个main函数,有且只有一个。

#include<stdio.h>  //引入头文件  标准的输入输出头文件
int main()         //main函数是程序的入口
{
	printf("first test\n");//  \n是换行的意思
	return 0;

程序运行结果如下图所示:

程序运行结果图

三、数据类型

1、整形

符号名称
char字符数据类型
short短整型
int整形
long长整形
long long更长的长整形

2、浮点型

符号名称
float单精度浮点数
double双精度浮点数

3、不同数据类型用来做什么?

类型是用来定义变量的,而定义变量本质上是开辟空间。

#include<stdio.h>
void main()
{//定义变量
	char ch;
	short s;
	int i;
	long L;
	long long LL;
	float f;
	double d;
}

4、数据类型的大小

每种数据类型的大小可以用sizeof()函数去求,其中结果的单位为字节。

void main()
{//求类型大小
	printf("%d\n", sizeof(char));        //1
	printf("%d\n", sizeof(short));       //2
	printf("%d\n", sizeof(int));         //4
	printf("%d\n", sizeof(long));        //4
	printf("%d\n", sizeof(long long));   //8
	printf("%d\n", sizeof(float));       //4
	printf("%d\n", sizeof(double));      //8
	printf("%d\n", sizeof(long double)); //8
}

5、衡量大小的单位

分配空间的最小单位是以字节为单位的。

符号名称
bit比特位
byte字节
kb千字节
mb兆字节
gb千兆字节——吉字节
tb“兆”为百万级数量单位 ——太字节
pb拍字节

1byte=8个bit
1k=1024b 1m=1024k 1g=1024m 1t=1024g 1p=1024t
1kb=210=1024b

6、初始化数据类型

void main()
{
	//初始化
	char ch = 'W';
	int a = 98;
	double s = 20.1;
}

四、变量与常量

1、变量

变量分为全局变量与局部变量,局部变量无法在其变量所在范围外被使用,而全局变量任意处均可以使用。

#include<stdio.h>
int x = 0; //全局变量
void fun()
{
	printf("x=%d\n", x);
	//printf("a=%d\n", a);此时编译不通过
}
void main()
{
	char ch = '0';//局部变量
	int a=0;//局部变量
	fun();
	printf("a=%d\n", a);
}

注意当局部变量和全局变量同名的时候,局部变量优先使用,代码实例如下所示:
此时,输出的结果为global = 2022,所谓近水楼台先得月便是如此,输出离得近的。

#include<stdio.h>
#include<stdbool.h>

int global = 2000;//全局变量
int main()
{
	int global = 2022;//局部变量
	printf("global = %d\n", global);
	return 0;
}

那么我们可以思考一下下面写代码输出的结果,如下:

#include<stdio.h>
#include<stdbool.h>
int global = 2000;//全局变量
int global = 2001;//全局变量
int global = 2002;//全局变量
int main()
{
	printf("global = %d\n", global);
	return 0;
}

实际上,此种情况下代码根本就无法编译通过,因为同一个范围内,一个变量只能定义一次。

(1)变量的使用
#include<stdio.h>
#include<stdbool.h>

//交互 
//printf()输出函数
//scanf()输入函数
void main()
{
	int a, b;
	printf("input a and b:>");
	scanf("%d %d", &a, &b);//取地址
	int result = a + b;
	printf("result=%d\n",result);
}

运行结果如下:
结果

(2)不同数据类型的打印
#include<stdio.h>//引入头文件  标准的输入输出头文件
#include<stdbool.h>

void main()
{
	//初始化
	char ch = 'W';
	short s = 10;
	int a = 98;
	double d = 20.1;
	char*str = "hello";//字符串
	size_t size = 100;//unsigned int

	printf("ch=%c\n", ch);
	printf("s=%d\n", s);
	printf("a=%d\n", a);
	printf("d=%lf\n", d);
	printf("str=%s\n", str);
	printf("size=%u\n", size);//u为无符号整形
}

运行结果如下:
结果

(3)作用域与生命周期

作用域(scope):程序设计概念,通常来说,一段程序代码中所用到的名字并不总是可用的,限定这个名字的可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程。

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

  1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期是:整个程序的生命周期。

2、常量

const 修饰的常变量

#include<stdio.h>//引入头文件  标准的输入输出头文件
#include<stdbool.h>
//常量不允许修改
void main()
{
	3.14;//字面常量
	const float p = 3.14f;
	//p = 6.5;
}

五、字符串、转义字符、注释

字符串

这种由双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串;超过一个字符都要用双引号引起。

    "hello bit."
#include<stdio.h>

void main()
{
	'A';//字符
	"A";//字符串 默认末尾含有一个\0
}

字符串的结束标志是一个 \0 的转义字符。
在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

#include<stdio.h>
//strlen()——获取字符串的长度
void main()
{
	printf("%d\n", strlen("abcxyz"));  //输出6
	printf("%d\n",strlen("abc\0xyz")); //输出3
}

通过以上代码我们可以发现,字符串的长度不是由表面看到的长度来决定的,而是什么时候遇到\0,什么时候结束。无法确定\0位置,则字符串大小为随机值。

#include<stdio.h>
//C语言本身没有字符串类型。通过字符数组来模拟。最标准的方式是数组方式,字符串实际上是模拟数组。
int main()
{
	char ar[] = "bit";                  //输出3
	char br[] = { 'b', 'i', 't' ,'\0' };//输出3
	char cr[] = { 'b', 'i', 't'};       //?随机值
	printf("%d\n",strlen(ar));
	printf("%d\n",strlen(br));
	printf("%d\n",strlen(cr));
	return 0;
}

转义字符

在屏幕上打印一个目录: c:\code\test.c

#include<stdio.h>

int main()
{
/*    //用于表示一个反斜杠,防止它被解释为一个转义序列符       */
	printf("c:\\code\\test.c\n");
	return 0;
}

转义字符顾名思义就是转变意思,下面是一些转义字符。

转义字符释义
?在书写连续多个问号时使用,防止他们被解析成三字母词
用于表示字符常量’
\“用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0
#include <stdio.h>
int main()
{
	printf("%d\n", strlen("abcdef"));            //输出6
	// \32被解析成一个转义字符, \328不能当作 \ddd形式,8进制中不存在8
	printf("%d\n", strlen("c:\test\328\test.c"));//输出14
	return 0;
}

关于\0用法的一些代码说明,如下所示:

int main()
{
	char ar[] = { 'b', 'i', 't', '0' };//随机值  '\0'不等于'0'
	char br[] = { 'b', 'i', 't', 0 };  //输出3  '\0'其实就是数字0,为了统一其表面现象
	printf("%d\n", strlen(ar));
	printf("%d\n", strlen(br));

	char ch = '5';                    //输出ASCII码值53,而不是输出真实值
	printf("%d\n",ch);

	char ch1 = '\5';                  //输出5,加\不再当作字符来看,转义将其当成数字来看
	printf("%d\n", ch1);
	return 0;
}

注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
注释有两种风格:
C语言风格的注释 /*xxxxxx*/        缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx         可以注释一行也可以注释多行

六、顺序语句、选择语句与循环语句

1、顺序语句

C语言中程序执行时是按语句来顺序执行的,其中每一条语句都以分号结尾。

2、选择语句

//输入大于10的数,输出OK,除此之外,则输出NO
#include <stdio.h>
void main()
{
	int value;
	printf("input value");
	scanf("%d", &value);
	if (value>10)
	{
		printf("OK\n");
	}
	else
	{
		printf("NO\n");
	}
}

3、循环语句

C语言中实现循环主要有三种方式:while语句,for语句, do … while语句。

while循环的实例

#include <stdio.h>
void main()
{
	int count = 0;
	while (count <1000)
	{
		printf("count=%d\n",count);
		count++;
	}
}

while循环语句先奏后斩

#include <stdio.h>
//当count = 1000时,没有值输出
void main()
{
	int count = 1000;
	while (count <1000)
	{
		printf("count=%d\n",count);
		count++;
	}
		printf("\n");
}

do while语句先斩后奏

#include <stdio.h>
//输出count = 1000
void main()
{
	int count = 1000;
	do
	{
		printf("count=%d\n", count);
		count++;
	} while (count < 1000);
}

for语句更加简洁

#include <stdio.h>

void main()
{
	for (int count = 0; count < 1000;++count)
	{
		printf("count=%d\n", count);
	} 
}

关于++的简单用法

#include <stdio.h>

void main()
{
	//value本身并不发生变化
	int value = 0;
	int result = value + 1;
	printf("value=%d\n", value);  //输出0
	printf("result=%d\n", result);//输出1
	
	//value本身发生变化
	//value = value + 1;
	value += 1;
	printf("value=%d\n", value);  //输出1
}

Visual Studio 2013中的前置加加与后置加加的用法,如下:

void main()
{
	int value = 0;
	int first = 0;

	int result = value++;//后置加加  int result=value(先赋值);value+=1(再加加)
	printf("value=%d\n", value);
	printf("result=%d\n", result);

	int outcome = ++first;//前置加加  first+=1(先加加);int outcome=value(后赋值);
	printf("first=%d\n", first);
	printf("result=%d\n", outcome);
}

注:不同的编译器,对其解释意义可能不同
例如:VC6.0中相同变量后加加分号结束才运算

#include <stdio.h>
//放入VC6.0中运算
void main()
{
	int a = 0;
	//从右往左算,本质是压栈,从左往右输出
	printf("%d %d %d %d\n", a++,++a,a++,++a);//输出2 2 1 1
	printf("a=%d\n", a);                     //输出4
}

七、函数

函数的特点就是简化代码,代码复用。

#include <stdio.h>
//函数 功能 面向过程
int Add(int a, int b)
{
	return a + b;
}
void main()
{
	int a = 1;
	int b = 2;
	int x = 10;
	int y = 20;

	int sum = Add(a, b);
	int sum1 = Add(x, y);
}

八、数组

该如何存储1-10的数字?

C语言中给了数组的定义:一组相同类型元素的集合

#include <stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//数组定义
	
	//数组使用
	for (i = 0; i<10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

九、操作符

1、操作符

算术操作符

+ - * / %

移位操作符

 >> <<

位操作符

& ^ |

赋值操作符

=     +=    -=   *=     /=     &=     ^=      |=      >>=     <<=

单目操作符

符号名称
!逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
- -前置、后置–
++前置、后置++
*间接访问操作符(解引用操作符)
(类型)强制类型转换

关系操作符

符号名称
>大于
>=大于等于
<小于
<=小于等于
!=用于测试“不相等”
==用于测试“相等

逻辑操作符:&& (逻辑与) , || (逻辑或 )
条件操作符:exp1 ? exp2 : exp3
逗号表达式:exp1, exp2, exp3, …expN

下标引用、函数调用和结构成员

 []     ()     .      ->

实例举例:

2、逻辑操作符

代码1:&&

#include <stdio.h>
void main()
{
	int a = 1;
	int b = 2;

	int result = a&&b;            //逻辑与运算,非0为真  true  false
	printf("result=%d\n", result);//输出1
}

代码2:&&

#include <stdio.h>
void main()
{
	int a = 1;
	int b = 0;

	int result = a&&b;            //逻辑与运算,非0为真,存在一个为0便是假
	printf("result=%d\n", result);//输出0
}

代码3:||

#include <stdio.h>
void main()
{
	int a = 1;
	int b = 0;

	int result = a||b;            //逻辑或运算,存在一个为真,则为真  true  false
	printf("result=%d\n", result);//输出1
}

代码4:非运算

#include <stdio.h>
void main()
{
	int a = 10;
	int b = 0;

	int result = !b;//逻辑非运算,非假为真,则为真  true  false
	printf("result=%d\n", result);//输出1
}

代码5:短路运算

#include <stdio.h>
void main()
{
	int a = 0;
	int b = 10;

	int result = a &&++b;          //&&左边为假,右边不参加运算;b不++,短路求值
	printf("result=%d\n", result); //输出0
	printf("b=%d\n", b);           //输出10
}

代码6

#include <stdio.h>
void main()
{
	int a = 0;
	int b = 10;

	int result = a ||++b;          //||左边为假,会继续看右边,右边参加运算;b++
	printf("result=%d\n", result); //输出1
	printf("b=%d\n", b);           //输出11
}

代码7:短路运算

#include <stdio.h>
void main()
{
	int a = 10;
	int b = 10;

	int result = a ||++b;          //||左边为真,不会再看右边,右边不参加运算;短路求值
	printf("result=%d\n", result); //输出1
	printf("b=%d\n", b);           //输出10
}

3、按位运算:&、|、^、~

&(与运算)
#include <stdio.h>
void main()
{
    //从二进制运算
	int a = 10;       //1010
	int b = 4;        //0100
	int result = a&b; //0000     
	printf("result=%d\n", result);  //结果输出为0  
}
|(或运算)
#include <stdio.h>
void main()
{
	int a = 10;       //1010
	int b = 4;        //0100
	int result = a&b; //1110       
	printf("result=%d\n", result);  //结果输出为14      
}
^(异或运算)
#include <stdio.h>
void main()
{
	int a = 10;       //1010
	int b = 4;        //0100
	//对应位不同为1,相同为0
	int result = a^b; //1110      
	printf("result=%d\n", result);//结果输出为14      
}

注:自己和自己异或结果为0

4、三目运算符

#include <stdio.h>

int Max(int a, int b)
{
   //三目运算符    ?   :
	return a > b ? a : b;//if类似,a>b为真时取a,为假时取b
}
void main()
{
	int a = 10;
	int b = 20;
	int max_value = Max(a, b);
	printf("Max value=%d\n", max_value);
}

5、逗号表达式

#include <stdio.h>

void main()
{
	int val = (1, 2, 3, 4, 5);
	printf("val=%d\n", val);    //输出5
}

十、常用关键字

常见关键字

auto  break  case  char  const  continue  default  do  double else  enum 
extern float  for  goto  if  int  long  register   return  short  signed
 sizeof  static struct  switch  typedef union  unsigned  void  volatile  while

typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

#include <stdio.h>
typedef unsigned int u_int;//类型重定义名字

void main()
{
	unsigned int a;
	u_int aa;
	unsigned long b;
}

static

C语言中:static是用来修饰变量和函数的

  1. 修饰局部变量——静态局部变量
  2. 修饰全局变量——静态全局变量
  3. 修饰函数——静态函数
局部

设置静态前:

#include <stdio.h>
void test()
{
	int i = 0;
	i++;
	printf("%d ", i);
}

int main()
{
	int i = 0;
	for (i = 0; i<10; i++)
	{
		test();
	}
	return 0;
}

结果
设置静态后:

#include <stdio.h>
void test()
{
//静态变量具有记忆性
	static int i = 0;//静态变量作用域随整个程序主函数
	i++;
	printf("%d ", i);
}

int main()
{
	int i = 0;
	for (i = 0; i<10; i++)
	{
		test();
	}
	return 0;
}

结果

static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

全局

代码1

//add.c
int g_val = 2018;
//test.c
#include <stdio.h>
extern int g_val;//引入
int main()
{
  printf("%d\n", g_val);
  return 0;
}

代码2

//add.c
static int g_val = 2018;
//test.c
#include <stdio.h>
extern int g_val;
int main()
{
  printf("%d\n", g_val);
  return 0;
}

代码1正常,代码2在编译的时候会出现连接性错误。

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

修饰函数

代码1

//add.c
int Add(int x, int y)
{
  return c+y;
}
//test.c
int main()
{
  printf("%d\n", Add(2, 3));
  return 0;
}

代码2

//add.c
static int Add(int x, int y)
{
  return c+y;
}
//test.c
int main()
{
  printf("%d\n", Add(2, 3));
  return 0;
}

代码1正常,代码2在编译的时候会出现连接性错误。

一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

十一、#define 定义常量和宏

#include <stdio.h>
#define SIZE 100   //define定义标识符常量
int main()
{
	int a = SIZE;
}

十二、指针

内存:内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。

所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

取出变量地址

变量都有地址,取出变量地址如下:

#include<stdio.h>
void main()
{
	int a = 10;
	&a;//取出num的地址
	printf("0x%p\n", &a);//打印地址,%p--以地址的形式打印
}

上面代码中其中a占4个字节,首地址代表a的地址

地址存储

void main()
{
	int a = 10;
	&a;//取出num的地址
	printf("0x%p\n", &a);//打印地址,%p--以地址的形式打印

	int *p = &a;//地址如何存储,需要定义指针变量。
}

指针变量的大小

#include<stdio.h>
int main()
{
	printf("%d\n", sizeof(char *));
	printf("%d\n", sizeof(short *));
	printf("%d\n", sizeof(int *));
	printf("%d\n", sizeof(double *));
	return 0;
}

指针大小在32位平台是4个字节,64位平台是8个字节。

十三、结构体

结构体使得C语言有能力描述复杂类型。

#include<stdio.h>
struct Student
{
	char name[10];
	int age;
	float weigh;
};
void main()
{
	struct Student s = {"小王",10,45.5};
	printf("%s %d %f\n", s.name, s.age, s.weigh);
}

输出:小王 10 45.500000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值