初识C语言(四)

1.数组

我们存储一个数是用一个变量就可以,例如: int  a = 10;但如果要存储十个数呢?这里我们就引入了数组。

定义:一组想同类型元素的集合。        

1.1数组的创建:    数据类型     数组名[ const_ ] ;

 

注意:const_ 是字面常量、const修饰的常变量、#define 定义的常量,不可是变量!!

例如:存储10个整数就可以创建一个整型数组。------>  int  arr[10] = {1,2,3,4,5,6,7,8,9,10};

1.2数组的下标

上面已经创建了数组,那么该如何访问数组中的元素呢?答案是用下标。而下标是从0开始的!

初识C语言(四)_第1张图片

初识C语言(四)_第2张图片

 例如:访问上面数组中的6就是5号下标;即 arr[5] =6;

1.3数组的使用:

#include
int main()
{
    int arr[10] ={1,2,3,4,5,6,7,8,9,10};
    int i = 0;//下标访问
    for(i = 0; i < 10; i++)
    {
        printf("%d\t",arr[i]);
    }
    return 0;
}

2.操作符

声明:这里仅仅是初识即大概认识不讲的太细,后面会把操作符一一详解的;

操作符分为算术操作符,赋值操作符,逻辑操作符和位操作符等;

2.1算术操作符:+        -        *        /        %

+        -        * 和数学中的一样;

/        又叫取商;        %        叫取余(模);

好,举个栗子:

#include

int main()
{
    int a = 5;
    int b = 3;
    int add = a + b;//加
    int dis = a - b;//减
    int mul = a * b;//乘
    int q = a / b;//商
    int w = a % b;//取余
    printf("%d %d %d %d %d ",add,dis,mul,q,w);
    return 0;
}

运行结果:

初识C语言(四)_第3张图片

2.2移位操作符:<<   >>

分别是左移和右移,左移和右移 移动的是二进制位;
<< : 左移相当于乘2(其实比乘的效果还快的多,这个后面会说明);
>> : 右移相当于除2(其实比除的效果还快的多,这个后面会说明);
OK,举个栗子(求一个数的二进制中1的个数):
#include

int main()
{
	int a = 15;
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if ((a>>i) % 2 == 1)
		{
			count++;
		}
	}
	printf("count = %d\n", count);
	return 0;
}

代码运行结果:

初识C语言(四)_第4张图片

2.3位操作符  

&         |          ^

后面操作符详解会详细说明!这三个可是很有用的,很多高级算法都是他们实现的!

2.4赋值操作符

=         +=         -=         *=         /=         &=         ^=          |=    >>=   <<=
= 这个是赋值操作符           == 是判断相等        != 是判断不等
举个栗子:
a = 3;//赋值        a == 2---->判断相等             a != 1 ----->判断不等
a += 1<---->a = a + 1;其他同理!

2.5单目操作符

   
!           逻辑反操作        //C中0 是假,非0是真
-           负值
+          正值
&          取地址(后期说道指针会详细说明)
sizeof      操作数的类型长度(以字节为单位) 不要将sizeof误认为是库函数!!!
~           对一个数的二进制按位取反(后期会说明)
--          前置、后置--
++        前置、后置++
*           间接访问操作符(解引用操作符)(指针是会详解)
(类型)       强制类型转换
初识C语言(四)_第5张图片

 举个栗子:

#include

int main()
{
	int a = 2;
	int b = 1;
	printf("%d\n", sizeof(a));//4
	printf("%d\n", sizeof(int ));//4
	printf("%d\n", sizeof a);//4
	int s = ++a;//3
	printf("%d %d\n", a,s);//3 3
	int m = b++;//2
	printf("%d %d\n", b,m);//2 1
	return 0;
}

运行结果:

初识C语言(四)_第6张图片

 2.6关系操作符

>        <         !=         >=        <=

2.7逻辑操作符

&& -----》逻辑与(并且)                ||----------->逻辑或(或者)

废话不多说,代码演示:

#include

int main()
{
	int y = 0;
	scanf("%d", &y);
	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
	{
		printf("Y");
	}
	else
	{
		printf("N");
	}
	return 0;
}

这是一个判断是否是闰年的代码正好运用了&&和||:

初识C语言(四)_第7张图片

2.8三目操作符

语法: 表达式1 ? 表达式2 :表达式3;

解释:如果表达式1 成立则结果是表达式2,表达式2的结果是整个程序的结果;否则结果是表达式3,整个程序的结果是表达式3;

#include

int Max(int x, int y)
{
	return x > y ? x : y;
}
int main()
{
	int a = 3;
	int b = 5;
	printf("%d\n", Max(a, b));
	return 0;
}

 代码运行结果和解释:

初识C语言(四)_第8张图片

 2.9逗号表达式

表达式1,表达式2,表达式3,表达式4......,表达式n;

逗号表达式是一连串的表达式,整个表达式的结果是最后一个表达式的结果!

举个栗子:

#include

int main()
{
	int a = 1;
	int b = 2;
	int c = 5;
	int d = (a += 2, b -= 1, c = a + b, c--);
			//a = 3	 b = 1	 c = 4	 c = 3
	printf("a = %d\nb = %d\nc = %d\nd = %d", a, b, c, d);
			
	return 0;
}

运行结果以及代码解释:

初识C语言(四)_第9张图片

2.10下标引用,函数调用和结构体成员 

[ ]    ( )     .   ->

后面说明(指针和结构体那里);

3.关键字

C语言中有32个关键字(如下),这些关键字是语言本身设定好的,用户不能自己创建的字。例如,你不能定义一个变量 变量名用 if  case 等。

 因为目前还是初识阶段,就先介绍几个,后面会一个一个的说明;

3.1关键字typedef

顾名思义,typedef就是类型的定义也就是重新命名;

举个栗子:

#include

typedef unsigned int uint_n;
int main()
{
	unsigned int num = 10;
	uint_n num2 = 20;
	printf("%d\t%d", num, num2);
	return 0;
 }

代码解释:

初识C语言(四)_第10张图片

3.2关键字static 

在C语言中static 是用来修饰变量核函数的,具体有三种情况:

1.static 修饰局部变量-------静态局部变量

代码演示(未被static 修饰的):
 

//代码1
#include

void test()
{
	int i = 0;
	i++;
	printf("%d ", i);
}

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

代码1打印的结果是 10个1

运行结果:
初识C语言(四)_第11张图片

 代码演示2(被static 修饰的)

#include

void test()
{
	static int i = 0;//静态变量
	i++;
	printf("%d ", i);
}

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

这里是被static 修饰的局部变量 i 您先猜猜打印的结果是多少?

运行结果:
初识C语言(四)_第12张图片

 代码解释:
static 修饰的局部变量 ,程序还没有执行时就已经为变量开辟了内存空间:让我们ton过调试看一看:

初识C语言(四)_第13张图片

程序刚刚调试起来还没有执行,i 中已经执行了i 和 i++ 。这就验证了上面所说的。

初识C语言(四)_第14张图片

这里通过上面代码以及结果分析,static 修饰的局部变量延长了局部变量的生命周期,让局部变量出了作用域任然有效,直到程序结束其生命周期才结束!原因是:static 修饰的变量改变了局部变量的存储位置,本来局部变量是存储在栈上的但被static 修饰后变到了静态区延长了生命周期,但其作用域不改变!!!(下面是内存的大概分布图)

初识C语言(四)_第15张图片

 2.static 修饰全局变量 --------静态全局变量

未被static修饰的全局变量

初识C语言(四)_第16张图片

上面这个例子说明了,局部变量有外部链接属性即使在其他原文件中也能使用(正确的方法使用extern 声明一下)。

被static 修饰的全局变量

初识C语言(四)_第17张图片

根本编译不过去!说无法解析外部符号a ! 也就是说static修饰的静态全局变量改变了全局变量本来的外部连接属性,使其原本的外部链接属性变成了内部链接属性(只能本源文件中使用,不能再其他源文件中使用了),即其改变了全局变量的作用域。

3、static 修饰的函数---------静态函数

未被static修饰的函数

初识C语言(四)_第18张图片

同全局变量一样,函数是具有外部链接属性的,只要使用方法正确(extern声明)就可以在外部文件中调用。

被static 修饰的函数 

初识C语言(四)_第19张图片

编译出错!无法解析Add函数。也就是和全局变量一样,static修饰的函数使函数原来的外部链接属性变成了内部连接属性,只能在本原文件中使用不能在其他语言文件中使用!

3.3#define定义的常量和宏

代码演示:

#define MAX 10 //#define 定义的常量

#define ADD(x,y) ((x) + (y))//#define 定义的宏

#include 

int main()
{
	int s = ADD(3, 5);//8
	printf("%d\n", s);
	printf("%d\n", MAX);//10
	return 0;
}

运行结果:

初识C语言(四)_第20张图片

4.指针 

内存是计算机中非常重要的存储器,计算机中的程序都是在内存中进行的!因此为了有效的使用内存,就把内存划分成为一个一个的内存小单元,每个内存单元是1个字节。为了能够有效的使用每个内存单元,就给每个内存单元进行编号把这些编号叫作内存单元的地址

我们知道变量是在内存中存储的,每个内存单元都有地址,所以创建一个变量也就会有地址,取地址如下代码:
 

#include

int main()
{
	int a = 10;
	printf("0x%p\n", &a);
	return 0;
}

运行结果:

初识C语言(四)_第21张图片

地址取出来了该如何储存?答案是指针!

代码演示:

初识C语言(四)_第22张图片

总结:指针是一个变量,作用是存放地址的,因为地址指向变量所以形象的讲指针称为地址!

指针变量的大小 

代码演示:

#include

int main()
{
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(double*));
	return 0;
}

您觉得是多少?下面我们来看两组代码运行:
初识C语言(四)_第23张图片

 32位sizeof返回值size_t 是 unsigned int 

初识C语言(四)_第24张图片

 32位sizeof返回值size_t 是 unsigned  long long

由上面的两个栗子可以看出,指针的大小是由32位/64位平台决定的,32位平台下是4个字节,64位下8个字节!

5.结构体

C语言中存储一个变量用的是一个变量,存储多个向同类型的变量用的是数组,那么存储不同类型的数据例如:学生信息等改用什么呢?没错是结构体!!!

废话不多说直接代码演示:
 

#include
struct Stu
{
	char name[20];
	int age;
	char sex[10];
	char id[15];
};
int main()
{	
	//结构体初始化
	struct Stu s = { "张三",20,"男","22111009" };
	//.操作符访问结构体成员
	printf("name : %s\tage : %d\tsex : %s\tid : %s\n", s.name, s.age, s.sex, s.id);
	//->操作符访问结构体成员
	struct Stu* m = &s;
	printf("name : %s\tage : %d\tsex : %s\tid : %s\n", m->name, m->age, m->sex, m->id);
	return 0;
}

代码运行结果:
初识C语言(四)_第25张图片

 关于  . 和 ->操作符会详细讲解!

你可能感兴趣的:(C语言从入门到进阶,c语言)