【C语言修炼手册】(一)入门基础知识

"这篇博客介绍了C语言的基础知识,包括数据类型如char、int、float、double等的大小,变量的定义与分类,常量的使用,以及作用域和生命周期。还详细讲解了运算符的种类,如算术、移位、位操作符等,并探讨了字符串的处理和数组的概念,特别是字符串的结束标志''和数组的大小计算。此外,还提到了结构体的声明和成员访问,以及一维和二维数组的创建与初始化。"
摘要由CSDN通过智能技术生成

😊

第一个C语言

#include<stdio.h>//头文件

int main()//main函数为主函数,有且仅有一个
{
	printf("hello world");
	return 0;
}

数据类型

char //字符数据类型
short // 短整型
int //整型
long //长整型
long long //更长的整型
float //单精度浮点数
double //双精度浮点数

  • C语言中无字符串类型。 在C语言中,字符串是被当做字符数组来处理的
数据类型大小
#include <stdio.h>
 
int main()
{
    printf("%d\n", sizeof(char));
    printf("%d\n", sizeof(short));
    printf("%d\n", sizeof(int));
    printf("%d\n", sizeof(long));
    printf("%d\n", sizeof(long long));
    printf("%d\n", sizeof(float));
    printf("%d\n", sizeof(double));
    printf("%d\n", sizeof(long double));
    return 0;
}

变量和常量

常量

顾名思义,即不变的值

C语言中常量分为以下几种:

  • 字面常量
    3.14;
    20;

  • const修饰的常变量(注意修饰为何意)
    const int num = 10;
    int num = 20;
    //error
    在这里插入图片描述
    //此时num为变量(具有不能被改变的属性)
    理解常变量

  • #define 定义的标识符常量

#define MAX 10000  // 在main函数里面定义也行
 	int main()
 	{
 		MAX = 20000;//error---理解标识符常量
 	}
  • 枚举常量
    一 一列举的常量
    (与结构体很相象)
int main()
	
enum Sex //enum类型为int型常量 
{
	MALE;//皆为枚举常量 
	FEMALE;
	SECRET; 	
	//按顺序存储
} 

int main()
{
	3.14;
	1000;//字面常量 
	const float pai = 3.14f;//const 起保护作用,防止被意外修改 
	pai = 5.14;//不成功 
	#define MAX 100   //#define的标识符常量 
	return 0;
} 

const 起保护作用,防止被意外修改

定义变量的方法

int age = 150;
float weight = 45.5f;
char ch = ‘w’;

变量的分类
  • 局部变量:定义在代码块({})内部的变量
  • 全局变量:定义在代码块({})之外的变量
#include<stdio.h>

int global = 2021;//全局变量 
int main()
{
	int local = 2020;//局部变量 
	int global = 2019;
	return 0;
}

局部变量和全局变量同名时,局部变量优先使用。局部变量和全局变量的名字尽量不要相同
C语言语法规定,变量要定义在当前代码块的最前面

变量的作用域和生命周期

作用域

限定可用性的代码范围
局部变量的作用域:变量所在局部范围
全局变量的作用域:整个工程

生命周期

即从创建到销毁之间的时间段
局部变量的生命周期:进入局部范围生命开始,出结束
全局变量的生命周期:整个程序的生命周期
(一个程序的生命周期即main函数里面)

常见关键字

C语言中有32个关键字

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

顾名思义为类型定义,(即类型重命名)

例如:

#include<stdio.h> 

typedef unsign int uint_1;

int main()
{
	unsign int num1 = 0;
	uint_1 num2 = 0;
	return 0;	
}
//两个变量类型一样 

字符串

"hello world\n"

如上,由双引号括起来的一串字符为字符串
字符串由\0结束,它只代表结束,不是实际内容

	char arr1[] = "abc";
	//char arr2[] = { 'a','b','c' };//error
	char arr2[] = { 'a','b','c' ,'\0'};//right
	
	printf("%s\n", arr1);//abc
	printf("%s\n",arr2);

\0仅仅是结束标志,计算字符串长度不包含在里面。
注意:求字符串数组元素的个数会计算\0
在这里插入图片描述

在这里插入图片描述

15 //15为随机值
从这个例子可以看出\0结束标志非常重要

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = {'a','b','c'};
	printf("%d", strlen(arr));
	return 0;
}

这里是引用
结果为随机值
原因
在这里插入图片描述

转义字符

要打印c:\code\test.c,直接打印结果却是
在这里插入图片描述
这个时候就要用到转义字符

  • \t即为转义字符的一种

输出单引号(

在这里插入图片描述

转义字符是C语言中表示字符的一种特殊形式。

转义字符释义
\a警告字符,蜂鸣
\b退格符
\f换页
\n换行
\r回车
\t水平制表
\v垂直制表
\ \反斜杠
\?问号符号
\ ’单引号字符
\ "双引号字符
\dddddd表示1~3个八进制的数字。如:\130-- X
\xdddd表示2个十六进制数字。如:\x30-- 0

在这里插入图片描述
八进制的130是十进制的88,即’X’—X的ASCII码是88

一道面试题: 在这里插入图片描述
你数得多少呢? 为什么结果又为14呢?

注释

注释有两种形式:
1./* xxxxxxx*/
2.//xxxxxxx

操作符

分类:

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号操作符

算术运算符

+ - * / %

/操作符

int a = 9 / 2; //4
// 得到的是商,不会得到4.5
//要得到4.5,可以这样
float a = 9 / 2.0;

移位操作符

<<左移操作符

>>右移操作符
左移操作符

num<<1
左边抛弃,右边补0
在这里插入图片描述
移动的是二进制位

右移操作符

逻辑移位:左补0,右丢弃
算术移位:左补符号位值,右丢弃

注意:使用移位运算符时,不要移动负数位

num>>-1;//error

位操作符

&   //按位与
|   //按位或
^   //按位异或

赋值操作符

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

单目操作符

! - + & sizeof ~ -- ++ * (类型)

计算数组元素个数
在这里插入图片描述

关系操作符

> >= < <= != ==

注意:要看清==和=的区别

逻辑操作符

&& 逻辑与
|| 逻辑或

注意区别逻辑和按位
1&2------>0
1&&2----->1

1|2------>3
1||2----->1

条件操作符

exp1? exp2 :exp3

逗号表达式

exp1,exp2,exp3,...expn

从左到右执行。整个表达式的结果为最后一个表达式的结果

int a = 1;
int b = 2;
int c = (a>b,a = b+10,a,b = a+1);
printf("%d",c);
return 0;
//结果为 13

指针

指针是C语言中的重难点,故此内容另起一篇再述

结构体

结构体的声明

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量

结构的声明
struct tag
{
	member-list;//结构体内成员可以是标量数组指针其他结构体
}variable;//属于全局变量(尽量不要这么写)
结构体成员的访问
  • 通过点操作符(.)实现。

s.age = 20; //使用.访问age成员

结构体指针访问成员时得到指向一个结构体的指针,此时应该这样访问:

ps->age
ps->age在计算机内部会被转化为(*ps).age (硬性规定)

结构体传参

结构体传参的时候要传结构体的地址,原因:

函数传参的时候,参数需要压栈。

在这里插入图片描述

数组

一维数组的创建和初始化

int arr[5];

// int为数组的元素类型
// [5] 是一个常量表达式,用来指定数组大小

int arr2[count];//error
int main()
{
	int n = 10;
	int arr[n] = { 0 };
	return 0;
}

在这里插入图片描述

上面代码错误
切记,数组[ ] 中不能是变量

一维数组的使用

数组使用下标([ ])来访问,下标从0开始
数组的大小可以通过计算得到,如下代码

int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

数组(一维数组,二维数组…)在内存中是连续存放的

二维数组的创建和初始化

二维数组的创建
int arr[3][4];
char arr[3][5];
二维数组的初始化
int arr[3][4] = {1,2,3,4};

数组名是什么呢?

数组名是数组首元素的地址(有两个例外)

1.sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
2.&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值