字符串+转义字符+注释
1.字符串
(定义太复杂了,我用自己理解解释)
就是相当于一段话,“”引号里面就是说话内容,引号里面是键盘上的所有字符组成的,当然也可以是中文
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
下面是字符串的定义与输出,字符串一般是用字符数组定义,因为字符串是多个字符组合起来的,输出是**%s**
#include <stdio.h> //下面代码,打印结果是什么?为什么?(突出'\0'的重要性) int main() { char arr1[] = "bit"; char arr2[] = { 'b', 'i', 't' }; char arr3[] = { 'b', 'i', 't','\0' }; printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", arr3); return 0; }
从这一段代码的运行结果就能看出来第二个没有加‘\0’输出了一堆乱码,那是因为不到结束标志就一直输出了后面计算机存储的内容,第一种定义不需要加‘\0’自动带有。
2.转义字符
转义字符 释义 \? 在书写连续多个问号时使用,防止他们被解析成三字母词 \' 用于表示字符常量' \“ 用于表示一个字符串内部的双引号 \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。 \a 警告字符,蜂鸣 b 退格符 \f 进纸符 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \ddd d d d表示1~3个八进制的数字。 如: \130 表示字符X \xdd d d 表示2个十六进制数字。 如: \x30 表示字符0
注:
\ddd: ddd表示1-3个八进制的数字。将ddd三个数字转换成十进制,十进制数对应的ASCAII就是结果。
dd表示2个十六进制的数字。将dd转换成十进制,十进制数对应的ASCAII就是结果。
(如果看不懂官方解释,通俗就是数字代替字符)
思考题
这里给大家留一个思考题,在文章最后我会开启一个投票,如果你能坚持到那就泰裤辣!!!!
这就是选择! //程序输出什么? #include <stdio.h> int main() { printf("%d\n", strlen("abcdef")); // \62被解析成一个转义字符 printf("%d\n", strlen("c:\test\628\test.c")); return 0; }
注释
(相当于生活中用到的便利贴)
- 1.单行注释 //xxxxxx
2.多行注释内容 /xxxxxx/
选择语句
C语言有选择结构和循环结构我们先介绍选择结构
选择结构就是我们常说的因果;
接下来我们用代码实现这张图
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<string.h> int main() { char ch[] = ""; scanf("%s", ch); if (strcmp(ch, "好好学习") == 0) { printf("好offer"); } else if (strcmp(ch ,"不好好学习")==0) { printf("烤地瓜"); } return 0; }
循环语句
就是持续做一件事然后有一个限制条件,不满足限制条件就跳出循环
依旧是代码实现循环
经典九九乘法表
int main() { //在屏幕上输出9 * 9乘法口诀表 for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) { int sum = i * j; printf("%d*%d=%d ", i, j, sum); } printf("\n"); } return 0; }
函数
函数基本结构
#define _CRT_SECURE_NO_WARNINGS 1
#include ;
返回值 方法名(形参){
函数所要实现的作用
return 返回值(和上面返回值类型一样);
}
int main() {
方法名(实参);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>; int Max(int a, int b) { int sum = a > b ? a : b; return sum; }//函数体 int main() { int a = 0;; int b = 0; scanf_s("%d %d", &a, &b); printf("%d",Max(a,b)); return 0; }
函数特点:提高代码复用率,清晰明了;
数组
1、一维数组,声明时数组名称前面的类型是数组元素的类型。
2、二维数组,可以作为种表格,它有行有列。
3、字符数组,c语言中没有字符串的概念只有单个字符,所以称一串字符串为字符数组。
数组初始化
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { //一维数组 int arr[] = { 1,2,3,4 }; //字符数组 char ch[] = { '1','2','3','4'}; //二维数组 int arr1[3][3] = { {1,2,3},{4,5,6},{7,8,9} }; printf("一维数组"); for (int i = 0; i < 4; i++) { printf("%d ", arr[i]); } printf("\n"); printf("字符数组"); for (int i = 0; i < 4; i++) { printf("%d ", arr[i]); }printf("\n"); printf("二维数组\n"); for (int i = 0; i < 3; i++) { for (int n = 0; n < 3; n++) { printf("%d ", arr1[i][n]); } printf("\n"); } }
2.数组下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
操作符
1.算数操作符
“+‘’ , “ -”, “ * ", “%d”
除了‘%’,其他操作符均可以作用于整数与浮点数。
‘/’如果两边的操作数均为整数,则结果为整数,有浮点数操作数则结果为浮点数。
‘%’两边的操作数均要为整数
2.移位操作符
“>>”,“<<”
左移操作
右移操作
3.位操作符
& ^ |
位移操作符只能作用于整数
4.赋值操作符
= ,+=, -=, *=, /=, &=, ^=, |=, >>=, <<=
5.单目操作符(操作一个值)
- !
int a=0;
//!a=0,就是相反操作,1为真!1就是假
- —和+
就是数学里面的对数字进行加减运算的操作符
- &
取地址就是得到储存在内存中的地址
- sizeof
int main() { int a = 0; short b = 2; printf("%d\n", sizeof(b = a + 2)); printf("%d", b); return 0; }
- ~
将一个整数的二进制位进行取反,不区分符号位统统进行取反处理
- ‘++’与‘- -’
就是自增1,自减1,多用在循环里面
#include <stdio.h> int main() { for (int i = 0; i < 100; i++) { printf("%d ", i); } printf("\n"); for (int i = 100; i > 0; i--) { printf("%d ", i); } return 0; }
最后一个我们最后指针在细讲;
6.关系操作符
7.逻辑操作符
8.条件操作符(三目操作,操作三个值)
意思是exp1为真执行exp1,为假则执行exp3
9.逗号表达式
exp1,exp2,exp3…expN
10.下标引用,函数调用,结构成员
关键字
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
//将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; }
static
在C语言中:
static是用来修饰变量和函数的
- 1.修饰局部变量-称为静态局部变量
- 2.修饰全局变量-称为静态全局变量
- 3.修饰函数-称为静态函数
修饰局部变量(局部变量储存在静态区,直到程序结束,才还给操作系统)
//将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; } //代码1 #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; } //代码2 #include <stdio.h> void test() { //static修饰局部变量 static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
对比代码1和代码2的效果理解static修饰局部变量的意义。
结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
static修饰全局变量
//代码1 //add.c int g_val = 2018; //test.c int main() { printf("%d\n", g_val); return 0; } //代码2 //add.c static int g_val = 2018; //test.c int main() { printf("%d\n", g_val); return 0; }
代码1正常,代码2在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用。
static修饰函数
与static修饰全局变量一样,只能在本文件使用,不能在其他源文件使用
#define定义常量和宏
/define定义标识符常量 #define MAX 1000 //define定义宏 #define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sum = ADD(2, 3); printf("sum = %d\n", sum); sum = 10*ADD(2, 3); printf("sum = %d\n", sum); return 0; }
指针
内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地
址。
简单来说指针就是定义内存中地址的值
//取出变量地址如下: #include <stdio.h> int main() { int num = 10; #//取出num的地址 //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
如何创建一个指针变量
那地址如何存储,需要定义指针变量。 int num = 10; int *p;//p为一个整形指针变量 p = #
指针使用实例
#include <stdio.h> int main() { int num = 10; int *p = # *p = 20; return 0; }
指针大小
#include <stdio.h> //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) 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语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
这里只能使用结构体来描述了。
例如:
结构体初始化
//结构体的初始化: struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 };
结构体应用
struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 }; //打印结构体信息 struct Stu s = {"张三", 20, "男", "20180101"}; //.为结构成员访问操作符 printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id); //->操作符 struct Stu *ps = &s; printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps- >id);
结尾
大家觉得有什么写的不妥或者不对的地方可以评论区留言,希望大家能够给博主一个三连,感谢!!!
我将会持续更新C语言进阶文章,希望大家能够多多支持
思考题投票区
文章知识点与官方知识档案匹配,可进一步学习相关知识