初识C语言

目录

一、变量

二、常量

三、字符串

四、选择语句

五、循环语句

六、函数

七、数组

八、操作符

九、常见关键字

十、define定义常量和宏

十一、指针 

十二、结构体


一、变量 

1.变量类型所占字节

char :1个字节
*(即指针变量): 4个字节/8个字节(在不同(32位/64位)编译器上不同)
short int : 2个字节
int:  4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   4个字节/8个字节(规定:sizeof(long)>=sizeof(int)即可,在不同(32位/64位)编译器上不同)
long long:  8个字节
unsigned long:  8个字节

2.局部变量和全局变量

当局部变量和全局变量名字冲突时,局部优先

3.scanf()和scanf_s()

(1)scanf():使用时在第一行或在*newc++ file.cpp文件中加

#define _CRT_SECURE_NO_WARNINGS 1

(2)scanf_s():传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安)全性(漏洞)黑掉系统-->更安全

切记键盘输入是要少敲一位字符,因为数组最后一位要放结束符
例:char[20]-->scanf_s("%s",d,20);//表示最多取19个字符

键盘响应输入的问题
第一种情况:
当我们scanf_s("%d%d%d",a,b,c);
如果你在键盘上输入了1 2 3(1空格2空格3),那么第一个空格就被当作字符了,要用回车来输入,键盘的按键顺序就是:1 Enter 2 Enter 3 Enter。
第二种情况:
当我们scanf_s("%d,%d,%d",a,b,c);
这个时候我们就需要用逗号隔开,比如想给a输入1,b输入2,c输入3。键盘的按键顺序就是:1 逗号 2 逗号 3 Enter

4.extern

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
(1)extern修饰变量的声明。
举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。

//源.c文件
int x=1;
//test.c文件
extern int x;
int main()
{
    return x;
}

(2) extern修饰函数声明。
从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。

(3) 此外,extern修饰符可用于指示C或者C++函数的调用规范。
比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

二、常量

1.字面常量

2.const 修饰常变量

const int n=10;//n不能再被重新赋值

int arr[n]={0};//n为变量,error

3.#define定义的标识符常量

#define MAX 10000

int main()
{
    //MAX=100;//error!不可以修改值的大小
    int n=MAX;
    printf("%d",n);
}

4.枚举常量

用于可以一一列举的常量

关键字:enum

#include<stdio.h>
enum SEX
{
    //这种枚举类型的变量的未来可能取值,值默认从0开始,不可以修改
    MALE,
    FEMALE,
    SECRECT
};
int main()
{
    enum Sex s=MALE;
    //MALE=3;//error
    printf("%d\n",MALE);   
    printf("%d\n",FEMALE); 
    printf("%d\n",SECRECT);
    return 0;
}

输出:

d2749f4cbef84e68874665f8ea3001bb.png

 三、字符串

1.定义方式

char arr[]="hello";

2.结束标志

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

3.字符串与字符数组

char arr1[]="abc";
char arr2[]={'a','b','c'};

//打印
printf("%s\n",arr1);
printf("%s\n",arr2);

输出结果;

78389ee302ce4b1dbe70fe77a502b8f5.png

arr1在内存中的内容:a b c \0                                                                                                            arr2在内存中的内容:a b c (其余为乱码)

 printf("%d\n", strlen(arr1));
 printf("%d\n", strlen(arr2));

输出结果:

1b1884bcf6c0407dbaa75335f191b45c.png

arr1的长度为字符个数                                                                                                                  arr2的长度为随机值

4.转义字符

转变了字符原来的意思 

转义字符

意义

\a

响铃(BEL)

\b

退格(BS) ,将当前位置移到前一列

\f

换页(FF),将当前位置移到下页开头

\n

换行(LF) ,将当前位置移到下一行开头

\r

回车(CR) ,将当前位置移到本行开头

\t

水平制表(HT) (跳到下一个TAB位置)

\v

垂直制表(VT)

\\

代表一个反斜线字符''\'

\'

代表一个单引号(撇号)字符

\"

代表一个双引号字符

\?

代表一个问号

\0

空字符(NUL)

\ddd

1到3位八进制数所代表的任意字符,如:\130

\xhh

十六进制所代表的任意字符,,如:\x30 0

printf("%c\n", '\130');

输出:

c1c06c21695741bfb1c3788997b1e222.png

 表示:八进制130等于十进制88(ASCII:X)

ASCII对照表:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU2MzE4,size_16,color_FFFFFF,t_70

 例:

printf("%d\n", strlen("c:\test\328\test.c"));

输出:

8df120ae0fba43a9a044a96b66d63f36.png

四、选择语句

int main()
{
	int input = 0;
	printf("小聪明聪明嘛(1/0)?\n");
	scanf_s("%d", &input);
	if (input == 1)
		printf("nice!bro");
	else
		printf("打洗你");
	return 0;
}

输出:

70cbf8bbb02c47168e6a4bf4b60d7a57.png

 五、循环语句

int main()
{
	int day = 1;
	while (day <= 300)
	{
		printf("第%d天:背单词\n", day);
		day++;
	}
	printf("四六级过了!");
	return 0;
}

输出:

ce4ff9b8d6d541a78be7dd23bdee79cc.png

 六、函数

int sum(int num1, int num2)
{
	return num1 + num2;
}

int main()
{
	int num1 = 0,num2 = 0;
	scanf_s("%d%d", &num1, &num2);
	printf("%d", sum(num1, num2));
	return 0;
}

输出:

d743d622597448dc82433269808fd2fd.png

 七、数组

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

数组是用下标来访问的,第一个元素下标为0

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//10个整形1-10存起来
	//char ch[5] = { 'a','b','c' };//不完全初始化,剩余的默认初始化为0
	int i = 0;
	while (i < 10)
	{
		printf("%d\n", arr[i]);
		i++;
	}
	return 0;
}

输出:
e02619be660f42d68198b425f7a5e8ed.png

 八、操作符

算数操作符+   -   *   /   %
移位操作符<<   >>
位操作符

&         按位与

^          按位或

|          按位异或

赋值操作符=   +=   -=   /=   &=   ^=   |=   %=   >>=   <<=

单目操作符

(只有一个操作数)

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

条件操作符 

(三目操作符)

exp1 ? exp2 : exp3 
逗号表达式exp1, exp2, exp3, ...expN
下标引用操作符[] 
函数调用操作符()
结构成员.     ->

1.移位操作符

移位操作符移动的是二进制位

例:

int main()
{
	int a = 2;
	int b = a << 1;
	printf("%d", b);
	return 0;
}

a:00000000000000000000000000000010

046f61ee59004fd6b7fe3ca5049c1cf4.png

b:00000000000000000000000000000100

输出:

b6f361bbaf32450087d9ba1c75349fb0.png

2.单目操作符

(1)sizeof后面的括号可以省略<--sizeof为单目运算符

(2)~(按位取反):把所有二进制位中数字,1变成0,0变成1

int main()
{
	int a = 0;
	printf("%d\n", ~a);
	return 0;
}

a:00000000000000000000000000000000

~a:11111111111111111111111111111111

整数在内存中存储的是补码

一个整数的二进制表示有三种:原码、反码、补码

-1的二进制表示(以下方法针对负整数,正整数的原码、反码、补码相同):

原码:10000000000000000000000000000001(第一位为符号位)

反码:11111111111111111111111111111110(符号位不变,原码其他位按位取反)

补码:11111111111111111111111111111111(符号位不变,反码+1)

输出:

6de9ec6852af48b08f95393137ee6c53.png

 (3)(类型):强制类型转换

int a=(int)3.14;

3.逻辑操作符

int main()
{
	int a = 3;
	int b = 5;
	int c = 0;
	printf("%d\n", a && b);
	printf("%d\n", a && c);
	printf("%d\n", a || c);
	return 0;
}

输出:

4f41b55746f74b08a2df83d24b7d72b3.png

 4.条件操作符

exp1?exp2:exp3  :exp1成立,exp2计算,整个表达式的结果是:exp2的结果                                                                exp1不成立,exp3计算,整个表达式的结果是:exp3 的结果       

int main()
{
	int a = 0;
	int b = 3;
	int max=a > b ? a : b;
	printf("%d", max);
	return 0;
}

输出:

cee72e75661e4651b27f6033fd1e6f7c.png

 5.逗号表达式

 逗号表达式:逗号隔开的一段表达式

从左到右依次计算,整个表达式的结果是最后一个表达式的结果

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

输出:

9d68684127204b13b7b3da9839725798.png

 九、常见关键字

是c语言提供的,不能自己创建关键字

关键字不能作为变量名

9f429bb8a3e44606a6d31c01b827882d.png#pic_center

 1.auto:修饰局部变量--自动创建,自动销毁,一般省略

auto int a=0;//自动变量

2.extern:用来修饰外部符号

3.register:寄存器关键字

大量频繁被使用的数据,放在寄存器中,提升效率

register int num = 100;//建议num的值存放在寄存器中

计算机中数据可以存放到哪里呢?

网盘——2T-免费,依赖网络,传输速率慢

硬盘——500G-买的,传输速率较快

内存——8-16G,传输速率快

高速缓存——几十MB,传输速率更快

寄存器——更小,传输速率最快

-->造价越高,速度越快,空间越小

4.signed:有符号的

unsigned:无符号的

5.union:联合体(共用体)

6.void:无、空

7.define、include不是关键字,是预处理指令

8.typedef:类型重定义,别名

//类型重命名
typedef unsigned int  u_int;
int main()
{
	unsigned int nim = 100;
	u_int num = 100;

	return 0;
}

9.static:静态的

(1)修饰局部变量:改变了局部变量的生命周期(本质上是改变了变量的存储类型)

void test()
{
	static int a = 1;
	a++;
	printf("%d ", a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

b39172c782ac4929a67162b3e4adb00c.png

加上static后,a存储在静态区,代码在执行完test()函数后仍不销毁,仍保留原来的值

输出:

f5fde75ae4d94fcbacea8e0ed3059052.png

(2)修饰全局变量,使得这个 全局变量只能在自己所在的源文件内部使用,其他源文件不能使用

全局变量在其他源文件内部可以被使用,这是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了

2c9342ab3a8341ee82142ca51afad310.png

 输出:

95ae64960970442aab23b534883647ad.png

(3)修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用

本质上,static是将函数的外部链接属性变成了内部链接属性

3f925453e6f54927a58be4236059aad4.png

 输出:

2ed0b846e7cd4edcb4bda3bce0af38df.png

十、define定义常量和宏

define:是一个预处理指令

1.定义符号

#define MAX 100
int main()
{
	printf("%d", MAX);
	return 0;
}

输出:

100

2.定义宏

例:计算4*(2+3)

#define ADD(X,Y) X+Y
int main()
{
	printf("%d", 4*ADD(2,3));
	return 0;
}

输出:

11

这是因为实际计算的其实是

0d8ea8a2dcda4580a0a9c932f9ca28ba.png

 应注意宏的书写方法

#define ADD(X,Y) ((X)+(Y))
int main()
{
	printf("%d", 4*ADD(2,3));
	return 0;
}

输出:

20

十一、指针

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

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

2.指针变量--用来存放地址(指针就是地址)

int main()
{
	int a = 10;//在内存中分配空间--4个字节
	printf("%p\n", &a);//%p--打印地址

	int* pa = &a;//pa--用来存放地址,称为指针变量
	
	return 0;
}

*     说明pa是指针变量
int   说明pa执行的对象是int类型的

输出:

010FFA18

3.解引用操作:*pa通过pa里面的地址,找到a

int main()
{
	int a = 10;
	int* pa = &a;
	
	*pa = 20;
	printf("%d\n", a);

	return 0;
}

输出:

20

4.指针变量的大小

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

}

输出:

4444444

所有指针变量的大小都是一样的(4个字节/8个字节)

这是因为,指针是用来存放地址的,指针需要多大空间,取决于地址的存储需要多大空间

32位平台-32bit--4字节

64位平台--64bit--8字节

十二、结构体

结构体是用来描述复杂对象的

例如:描述一个学生,包括 姓名、年龄、性别 等信息

共有三种输出方式:

int main()
{
	struct Stu s = { "xcm",20,95.50};//结构体创建和初始化
	//输出方式1
	printf("%s %d %lf\n", s.name, s.age, s.score);//格式:结构体变量.成员变量
	//输出方式2
	struct Stu* ps = &s;
	printf("%s %d %lf\n", (*ps).name, (*ps).age, (*ps).score);
	//输出方式3
	printf("%s %d %lf\n", ps->name, ps->age, ps->score);
	return 0;
}

输出:
adb7349ed6144f94a3727fd272cfe606.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值