初识C语言(3)

嘿!老铁们大家好呀!我是冰淇凌加点糖。今天我们继续开始C语言的学习吧!

操作符

操作符有很多,今天主要是简单的介绍一下,后续的文章里,我会对此进行深入的介绍。

算术操作符:+、-、*、/      (加、减、乘、除)

移位操作符:>>、<<           (右移、左移)

位操作符:&、^、|              (按位与、按位异或、按位或)

赋值操作符:=、+=、-=、*=、&=、^=、|=、>>=、<<=         (除了第一个,其他都是原地赋值即进行运算操作之后赋值给自身)

单目操作符:

逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反(二进制数的反码)
--前置--、后置--
++前置++、后置++(区别后面说不要着急哟)
*解引用操作符,(间接访问操作符)
(类型)强制类型转换

关系操作符:

>大于
大于等于
<小于
<=小于等于
!=用于测试“不相等”
==用于测试“相等”

 逻辑操作符:

&&逻辑与(短路与,前面为假,后面直接不执行)
||逻辑或(短路或,前面为真,后面直接不执行)

条件操作符:

exp1 ? exp2 : exp3若exp1为真,则exp2;反之exp3

逗号表达式:

exp1,exp2,exp3,……,expn

每一个表达式都执行,但最后的结果是最后一个表达式的结果

下标引用、函数调用和结构体成员:[ ]、( )、.(点) 、 ->

常见关键字

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>
// 将unsigned int 重命名为uint_32,所以uint_32也是一个类型名
typedef unsigned int uint_32;

int main()
{
	// 观察num1和num2,这两个变量的类型是一样的
	unsigned int num1 = 0;
	uint_32 num2 = 0;
	return 0;
}

 运行上述代码,查看监视器,可以看见两个变量的类型是一致的。所以,typedef是对类型进行重命名。

关键字static

在C语言中:

static是用来修饰变量和函数的

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

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

3.修饰函数---静态函数

(一)修饰局部变量

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

void fun2()
{
	static int j = 0;
	j++;
	printf("%d ", j);
}

int main()
{
	printf("fun1:  ");
	for (int a = 0; a < 10; a++)
	{
		fun1();
	}
	printf("\n");
	printf("fun2:  ");
	for (int a = 0; a < 10; a++)
	{
		fun2();
	}
	printf("\n");
	return 0;
}

上述代码可见,fun1函数中的局部变量i没有被static修饰,而fun2函数中的变量j被static修饰从而成为了静态局部变量。然后分别对fun1和fun2函数执行十次,打印出来的结果如上图所示。 static修饰了局部变量改变了局部变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

(二)修饰全局变量

//代码1
//add.c
int g_val = 2024;
//test.c
#include<stdio.h>
extern int g_val;	//extern 声明外部符号
int main()
{
	printf("%d\n", g_val);
	return 0;
}



//代码2
//add.c
static int g_val = 2024;
//test.c
#include<stdio.h>
extern int g_val;	//extern 声明外部符号
int main()
{
	printf("%d\n", g_val);
	return 0;
}

上述代码,只有代码1可以正确运行,代码2编译时发生了连接错误。可见,一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用, 不能在其他源文件内使用。

(三)修饰函数

//代码1
//add.c
int Add(int x,int y)
{
	return x + y;
}
//test.c
#include<stdio.h>

int main()
{
	printf("%d\n", Add(3,4));
	return 0;
}



//代码2
//add.c
static int Add(int x,int y)
{
	return x + y;
}
//test.c
#include<stdio.h>

int main()
{
	printf("%d\n", Add(3,4));
	return 0;
}
上述代码,代码 1 正常,代码 2在编译的时候会出现连接性错误。 一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
总结:
1.static修饰局部变量会使得该局部变量生命周期改变,直到程序结束生命周期才结束。
2.static修饰全局变量和函数都会使得该全局变量和函数只能在本源文件内使用,不能在其他文件中使用。

#define定义常量和宏

#define MAX 1000
#define ADD(x,y) ((x) + (y))
#include<stdio.h>
int main()
{
	printf("MAX = %d\n", MAX);

	int sum = ADD(2, 3);
	printf("%d\n", sum);

	sum = 10 * ADD(2, 3);
	printf("%d\n", sum);
	return 0;
}

define是将程序中的原符号完整用后面的表达式代替。

指针

内存

内存是电脑中的存储器,计算机中的程序运行都是在内存中进行的。

为了有效使用内存,将内存划分为多个内存单元,每个内存单元的大小是1字节。1字节=8比特位。为了方便访问内存单元,于是将内存单元进行编号,这些编号为内存单元的地址。

变量是创建在内存中的,每个内存单元都有地址,每个变量也有地址。

取出变量地址如下:

上述中 '&'是引用符号,用于取出变量num的地址。这里取出的是第一个字节的地址(较小的地址)。打印地址,%p是以地址的形式打印。

指针

存储地址需要用到指针,那么如何定义指针变量呢?

#include<stdio.h>
int main()
{
	int num = 10;
	int* p = &num;
	printf("before: *p = %d\n", *p);
	*p = 20;
	printf("after: *p = %d\n", *p);
	return 0;
}

int* p表示p为一个整型指针变量.  int* p = &num实际上可以表示为int* p声明了一个指针变量p,p = &num。整型指针变量p存放了num变量的地址。 ‘*’ 表示解引用,*p是取出p地址中存放的值。

指针变量的大小

#include<stdio.h>

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

指针变量的大小取决于地址的大小,32位平台下地址是32bit位(4字节),64位平台下地址是64bit位(8字节).

结构体

这里初步介绍一下结构体的使用。例如

#include<stdio.h>
struct stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[15];//学号
};

int main()
{
	struct stu s = { "张三",20,"男","20240509" };
	//.为结构成员访问操作符
	printf("name = %s, age = %d, sex = %s, id = %s\n", s.name, s.age, s.sex, s.id);
	//->操作符
	struct stu* p = &s;
	printf("name = %s, age = %d, sex = %s, id = %s\n", p->name,p->age,p->sex,p->id);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值