当前位置: 首页 > news >正文

【C语言】初识C语言+进阶篇导读

✨个人主页: Anmia.
🎉所属专栏: C Language

🎃操作环境: Visual Studio 2019 版本

 本篇目的是面向编程新手,没接触过编程的人。以及C进阶的导读。

内容是C语言重要知识点的简单解释,不做详解。给新手对初级C框架的认识。由于篇幅上万字,干货满满。请大家沉下心看,一定有新的发现。

目录

1.什么是C语言?

2.C语言代码的基本格式

3.数据类型 

4.变量、常量

 4.1 定义变量的方法

4.2 变量的分类

4.3 变量的使用

4.4 变量的作用域和生命周期 

4.5 常量

5.字符串+转义字符+注释

字符串

转义字符

转义字符 \? 

转义字符 \' 与 \" 

 转义字符 \t

转义字符\ddd和\xdd

转义字符 \\

 转义字符\a

转义字符\b

转义字符\f

转义字符\v

转义字符\r

注释 

 6.选择语句

if  else

switch case

7.循环语句

while

 do...while

for

8.函数

库函数 

自定义函数

9.数组

数组的定义

数组的下标

数组的使用

操作符

 10.常见关键字

关键字 typedef

关键字static 

 #define 定义常量和宏

 11.指针

 内存

怎么取地址?

指针变量的大小

12.结构体 

 后言 


1.什么是C语言?

C 语言是一门通用 计算机编程语言 ,广泛应用于底层开发。 C 语言的设计目标是提供一种能以简易的方式 编译 、处理低级 存储器 、产生少量的 机器码 以及不需要任何运行环境支持便能运行的编程语言。
        尽管C 语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式 处理器 (单片机或称 MCU )以及超级电脑等作业平台。
        二十世纪八十年代,为了避免各开发厂商用的C 语言语法产生差异,由 美国国家标准局 为 C 语言制 定了一套完整的美国国家标准语法,称为 ANSI C ,作为 C 语言最初的标准。 [1] 目前 2011 年 12 月 8 日,国际标准化组织(ISO )和国际电工委员会( IEC )发布的 C11 标准 是 C 语言的第三个官方标准,也是C 语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
        C语言是一门面向过程的计算机编程语言,与 C++ , Java 等面向对象的编程语言有所不同。


2.C语言代码的基本格式

#include <stdio.h>
int main()
{printf("Hello World!\n");return 0; 
}

运行结果如下:

#include <stdio.h> :每一个C语言程序代码都含有的一个头文件,其中include 称为文件包含命令,其意义是把尖括号<>或引号""内指定的文件包含到本程序中,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h,而stdio为standard input output的缩写,意为“标准输入输出” ,在程序中为固定格式,输入上去就行。

 int main():main函数是程序的入口 ,一个工程中main函数有且仅有一个,是C语言main函数的一种声明方式,在int main()下有一对{},在其中输入代码。" { " 代表程序执行的开始,“ } ”表示程序执行的结束,可见main函数的重要性。

printf:表示要输出的结果,其结果放入("  ")中的双引号内,如果需要特别打印某一种字符类型,一般格式为(“格式控制字符串”,输出值参数表)。

return 0:返回值为0,先不做深入了解,记作固定的格式,打上去就行。

注:每一个语句后面需要打上一个英文状态下的分号  ; 

C语言 printf 详解


3.数据类型 

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

它们占用的空间大小是?

#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;
} 

代码中%d意思是打印出来的数据是整型数据,sizeof()用于打印数据类型的大小。  

其中数字大小表示各种数据类型的空间大小,单位为字节(byte)

1GB=1024MB
1MB=1024KB
1KB=1024byte
1byte=8bit

其中位:是二进制数据中的一个位(bit)简写为b,中译为比特,是计算机存储数据的最小单位

注意:存在这么多的类型,其实是为了更加丰富的表达生活中的各种值
类型的使用:

char ch = 'w';
int weight = 120;
int salary = 20000;

4.变量、常量

常量: 不变的值, C 语言中用 常量 的概念来表示,在生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)。

变量: 会变的值, C 语言中用 变量 来表示(比如:年龄,体重,薪资)。

 4.1 定义变量的方法

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

4.2 变量的分类

  • 局部变量
  • 全局变量
#include <stdio.h>
int global = 2023;//全局变量
int main()
{int local = 2023;//局部变量//下面定义的global会不会有问题?int global = 2020;//局部变量printf("global = %d\n", global);return 0;
}

总结:
上面的局部变量global变量的定义其实没有什么问题的!
当局部变量和全局变量同名的时候,局部变量优先使用。

4.3 变量的使用

#include <stdio.h>
int main()
{int num1 = 0;int num2 = 0;int sum = 0;printf("输入两个数:>");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("sum = %d\n", sum);return 0;
}
  • 输入用:scanf
  • 输出用:printf

4.4 变量的作用域和生命周期 

  • 作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。

通俗点来说:哪里可以使用这个变量,那里就是变量的作用域。

  • 生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1.部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
2. 局变量的生命周期是:整个程序的生命周期

4.5 常量

C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量

#include <stdio.h>
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{//字面常量演示3.14;//字面常量1000;//字面常量//const 修饰的常变量const float pu = 3.14f;  //这里的pai是const修饰的常变量pu = 5.14;//是不能直接修改的!//#define的标识符常量 演示#define MAX 100printf("max = %d\n", MAX);//枚举常量演示printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);//注:枚举常量的默认是从0开始,依次向下递增1的return 0;
}

注意:上面例子上的 pu 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面被限制了
变量 pu 不能直接被改变,但是 pu 本质上还是一个变量的,所以叫常变量。


5.字符串+转义字符+注释

  • 字符串

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。 

"Hello World\n"

 注:字符串的结束标志是一个“ \0 ” 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

 下面代码,打印结果是什么?为什么?(突出'\0'的重要性)

#include <stdio.h>
int main()
{char arr1[] = "good";char arr2[] = { 'g', 'o', 'o','d' };char arr3[] = { 'g', 'o', 'o','d','\0' };printf("%s\n", arr1);printf("%s\n", arr2);printf("%s\n", arr3);return 0;
}

运行结果如下:

  • 第一个字符串放在数组里面时,末尾会默认输入一个 \0,其实放入的内容有‘g’,‘o’,‘o’,‘d’,‘\0’,所以打印完good后就结束了。
  • 第二个每个字符单独分开,末尾是不会默认输入\0 的,所以在打印完good以后并没有结束打印,后面的直到遇到 \0 才结束。因此这种 \0 是具有随机性的,写法是不可取的。
  • 第三个相比第二个,加了 \0,因此在打印完字符good后会直接遇到 \0,结束打印。

  • 转义字符

假如我们要在屏幕上打印一个目录: c:\code\test.c

像下面这样写吗?

#include <stdio.h>
int main()
{printf("c:\code\test.c\n");return 0;
}

运行结果如下:

其实上面里面的 \  \t  \n,都被当成转义字符了,转义字符顾名思义就是转变原来的意思。不会以原来的样子输出。

下面看看常见的转义字符。

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\'用于表示字符常量'
\“用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\ddd ddd表示1~3个八进制的数字。 如: \130 X
\xdd dd表示2个十六进制数字。 如: \x30 0
  • 转义字符 \? :在书写连续多个问号时使用,为了防止他们被解析成三字母词。一般老版本编译器才会出现。如下代码:

printf("Are you OK??\n");
printf("Are you OK\?\?");

 可见现在的编译器效果一样,所以不必担心。

  • 转义字符 \' 与 \" :想输出单引号和双引号,必须用这种方式

printf(" \' ");
printf(" \" ");

如果直接打 ' 或者 " 上去会怎么样?

 结果是 ’ 可以打印," 直接报错了,因为编译器不知道你想输出的 " 和 前面还是后面的 "配对,printf结构错误。

总结:为了统一规范,我们一律用 \' 和 \"

  •  转义字符 \t :水平制表符,输出结果相当于一个按一次Tab健所拉开的距离

printf("A\ta");

可见两个字母之间的间隔就是 \t 所拉开的一个Tab的距离

  • 转义字符\ddd和\xdd:

  • ddd 表示 1~3个八进制的数字。 如: \130 ,
  • dd 表示 2 个十六进制数字。 如: \x30
printf("\101\n");
printf("\x42");

打印时输出的是对应表示的进制转化为十进制后十进制对应ASCII码表对应的字符

八进制\101转化为十进制表示的数是65,对应字母A

十六进制\x42转化为十进制表示的数是66,对应字母B

ASCLL表如下:

转义字符 \\:

我们之前说到 \ 是一个转义字符,会转变原来的意思。那两条 \\ 用 \ 把转义字符 \ 的意思转成普通字符了呗。好理解吧,负负得正。

printf("\\");

可见,前面的 \ 把后面转义字符 \ 转化成普通字符\  

 转义字符\a:

警告字符,蜂鸣。

打印的时候会响一声“叮”

printf("\a");

转义字符\b:退格符

printf("123456\b\b\b\b");

 \b表示向后退格,退到相应位置时,相应的字符将无法打印,会具有叠加效果。

转义字符\f:换页,将当前位置移到下一页的开头,在使用打印机时会直接换页,在编译器中表现不出来

转义字符\v:垂直制表符,也用于打印时

转义字符\r:回车,将当前位置移到本行的开头,并覆盖打印


  • 注释 

1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字

#include <stdio.h>
int Add(int x, int y)
{return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{return x-y;
}
*/
int main()
{//C++注释风格//int a = 10;//调用Add函数,完成加法printf("%d\n", Add(1, 2));return 0;
}

注释有两种风格:

C语言风格的注释 /*xxxxxx*/

缺陷:不能嵌套注释

C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行


 6.选择语句

  • 在生活中,有着各种各样的选择,一旦选择了一方,结果可能有所不同。
  • 在编程中,编程中也有选择,编程无非也是为了更好的解决生活中的问题和不足,那既然如此,编程中的选择无非就是抽象化的描述和解决现实问题。

 在C语言中,有着比较常用的两种选择语句

  • if-else
  • switch-case

if  else

#include <stdio.h>
int main()
{int score = 0;scanf("%d", &score);if (score >= 90){printf("good");}else{printf("bad");}return 0;
}

看上面代码,输入了score的值,如果if(条件),条件是成立的(即score>=90),执行if()后{}括号中的内容。否则,执行else后{}中的内容。

当然这是最简单的if-else用法,还有其他嵌套用法,将在详解篇介绍。

switch case

从上面的例子可以看出,if-else的条件表示一段范围,如果要表示一堆点,if-else岂不是要写一堆?关于多点选择可以用对口的switch-case,它最擅长对点进行选择。看以下例子。

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("working day");break;case 6:case 7:printf("holiday");break;}return 0;
}

 

 

输入今天是星期几,如果是1-5就输出working day,否则,如果输入值是6-7,就输出holiday。通过这个例子我相信你应该对上面代码有一定的理解了。至于break语句,当前只需要知道在switch-case语句如果不写break,就会继续执行下面语句。比如我输入5 会输出working day 和 holiday 。

没理解也没关系,后面详解会一一讲清楚。


7.循环语句

  • 在生活中,路肯定不是一番风顺的。往往是会经历到一定时间的循环轮回,但总会突破循环,继续前行。
  • 在编程中,编程中也有循环,我们把生活中循环往复的事情,用C语言抽象化的表达和优化,能帮助我们解决实际中的一些问题。

注意:循环一定要有出口,不能陷入死循环中,好比生活中,不可能因为一件事就停滞不前

  在C语言中,有三种循环语句

  • while
  • do...while
  • for

while

 while(条件) { ... };

上面是一个while循环体。如果()中条件成立,则循环往复做{ }中的内容,每做完一遍会回到()条件判断,如果还成立就继续,如果不成立了,则不再执行该while循环体,继续执行循环体下面的内容。

#include <stdio.h>
int main()
{int i = 1;while (i <= 10){printf("%d ", i);i++;}return 0;
}

上面代码实现了1-10的依次输出。

  • 代码逻辑:开始初始化 i = 1 ,判断while循环条件 1 <= 10条件成立,进入循环,printf打印1,i++后 i = 2。再次进入循环判断 2 <= 10,再次进入循环,printf打印2,i++中 i=3.......直到 i>10 循环条件不成立了,结束循环体。

 do...while

 前面提到while循环是先判断循环条件成立才会进入循环。一旦不成立压根就不会进入循环。那有先进入循环再判断的循环体吗?有的!do...while循环正合适。

#include <stdio.h>
int main()
{int i;do{printf("1. play \n");printf("2. exit \n");printf("select:>");scanf("%d", &i);} while (i);return 0;
}

 

不知道大家有没有玩过 单机数码游戏,在每次玩完后一把会询问你是否再来一把,或者退出游戏。do...while循环设计正合适。

  • 代码逻辑:通过上面代码可以看到先是printf输出了1.play 2.exit select:>说明了它已经执行循环体了,然后我们输入i 的值如果结果为真(除了0以外的值),do...while(条件)成立,继续执行循环体,直到条件不成立退出循环。
  • 我们看看第二个运行结果,我们直接输入0,do...while(条件)为假(在C语言中数值0可以表示为条件不成立),直接结束了循环。
  • 与while循环的区别?:while循环是先判断,如果成立就循环,不成立就结束循环或不循环。do...while循环是先执行循环体一次,后判断条件,如果成立就循环,不成立就结束循环或不循环。

for

for循环是C语言中最常用的循环,因为它结构清晰,便于优化,更加推荐使用。

for语句的基本结构

for(语句1 ; 语句2 ; 语句3)

{

        ......循环体

}

语句1一般用于初始化

语句2是条件判断语句,即满足这个条件就执行循环体,不满足时就退出循环。

语句3是一般用于控制循环的结束的一个条件

我们可以通过下面例子来了解。

#include <stdio.h>
int main()
{int i;for (i = 0; i < 10; i++){printf("%d ", i);}return 0;
}

以上代码将0-9的数字依次输出。

代码逻辑:开始定义了一个变量i ,在for循环语句1时执行了i=0,变量i得到初始化。语句2意思是当 i<10时就执行循环体。语句3意思是没执行完循环体后执行 i++ 。这样循环往复,直到 i=10 则 i<10这个条件不再成立了,就结束循环。

逻辑如下。

语句1-->语句2(成立)-->循环体-->语句3-->语句2(成立)-->循环体-->语句3-->......-->语句2(不成立)-->循环结束。


8.函数

函数分成两类

  • 库函数
  • 自定义函数 

库函数 

库函数是什么?

        回顾之前用到的printf它就是一个库函数,它可以将内容按照指定的格式输出。它是凭空产生的吗?不是!它无非也是人写出来的一个函数。当我们包含<stdio.h>这个头文件时,就可以调用它了,至于它函数内部怎么实现我们不需要知道,我们需要用时调用它,以便于我们日常的开发。这里是官网,有需要可以去了解。
        C++官网(英文版): cppreference.com
        C++官网(中文版): cppreference.com
        也可去: cplusplus.com - The C++ Resources Network
对库函数简单的分类:
                                        1. IO函数
                                        2.字符串操作函数
                                        3.字符操作函数
                                        4.内存操作函数
                                        5.时间/日期函数
                                        6.数学函数
                                        7.其他库函数

 :但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。

自定义函数

如果库函数能干所有的事情,那就不需要程序员了, 所以更加重要的是自定义函数自定义函数和库函数一样,有函数名,返回值类型和函数参数。所以,库函数无非就是别人写好的自定义函数, 我们直接拿去用了。自定义函数都是由我们自己来设计。这给程序员一个很大的发挥空间。

看如下代码

#include <stdio.h>
int main()
{int a, b, c;scanf("%d%d", &a, &b);c = a + b;printf("%d\n", c);return 0;
}

上面代码将输入的a和b的值相加。

但有个问题,我们如果想再输入再相加完输出,是不是把这个段代码复制一遍也能实现。

#include <stdio.h>
int main()
{int a, b, c;scanf("%d%d", &a, &b);c = a + b;printf("%d\n", c);scanf("%d%d", &a, &b);c = a + b;printf("%d\n", c);return 0;
}

看代码和运行结果也是可行的。但是会不会感觉代码很乱啊?我们新手可能还没接触上千上万行代码,或许没感觉到乱。事实上,代码复用是不好的,未来可能重复做的一件事,我们会封装成函数,需要时调用一下就好,不需要每次都写一遍。这样可以了解到函数的魅力吗?

我们可以知道上面重复做的事是两个数的加法,并输出。我们用一个函数封装试试。

#include <stdio.h>
void add()
{int a, b, c;scanf("%d%d", &a, &b);c = a + b;printf("%d\n", c);
}
int main()
{add();add();return 0;
}

我们把两数相加,并输出。当成一个整体,封装成一个函数。在主调函数main中,用add();函数调用语句就可以调用这个add被调函数了,不需要再写一遍。好比printf函数我们只需要按照它执行的方式调用它,我们就可以实现内容的输出。也不需要知道它函数内部是怎么写的。这大大减少我们的代码复用问题,使代码更加结构化。一个函数一个功能,相互之间,在有需要时,按照规则,正确调用,使代码更加清晰。


9.数组

数组的定义

如果要存储1-10的整型数字,怎么存储?

我们知道 int 类型可以存储一个整型数据,那10个就写10个咯?

如果要100甚至是1000个呢?一个个定义吗?
C语言中给了数组的定义:一组相同类型元素的集合,即数组。

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

上面定义了一个名为 arr 的的数组,

每个元素的类型是 int 型,

数组的大小是10个元素,

每个元素依次被初始化为1-10

数组的下标

上面我们定义了一个数组,那怎么使用它呢?

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的

如下:

  • 如果我们要访问数字7,即用arr[6]。如果访问数字9呢?即用arr[8]。
  • 在调用时【】中的内容时只数组中的第几个元素,但要注意的时下标从0开始。比如你要访问第一个元素,你要写arr[0],才对。

数组的使用

如果我们要访问数组中多个元素,我们一般用循环来访问,如下。

#include <stdio.h>
int main()
{int i;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i < 10; i++){printf("%d\n", arr[i]);}return 0;
}

 

 我们用for循环,i来控制访问时数组的下标,i从0开始++到i=9,数组数组小标0-9的内容。i=10时退出循环。


操作符

算术操作符+         -         *         /         %
移位操作符>>         <<
位操作符&         ^         |
赋值操作符=         +=         -=         *=         /=         &=         ^=         |=         >>=         <<=
单目操作符!      逻辑反操作
-      负值
+      正值
&      取地址
sizeof    操作数的类型长度(以字节为单位)
~      对一个数的二进制按位取反
--      前置、后置--
++      前置、后置++
*      间接访问操作符(解引用操作符)
(类型)    强制类型转换
关系操作符>
>=
<
<=
!=  用于测试“不相等”
==    用于测试“相等”
逻辑操作符&&   逻辑与
||      逻辑或
条件操作符exp1 ? exp2 : exp3
逗号表达式exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员[]         ()         .         ->

这里总结了C语言中较全的操作符,简单的将其分类先,先不做多详解。 


 10.常见关键字

 auto          break          case          char          const          continue          default          do  double         else          num         extern         float          for          goto          if          int  long          register       return       short          signed      sizeof          static         struct  switch      typedef         union     unsigned      void        volatile          while

C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。
注:关键字,先介绍下面几个,后期详解会讲。

关键字 typedef

 typedef 顾名思义是类型定义,这里应该理解为类型重命名

//将unsigned int 重命名为uint, 所以uint也是一个类型名
typedef unsigned int uint;
int main()
{//观察num1和num2,这两个变量的类型是一样的unsigned int num1 = 0;uint num2 = 0;return 0;
}

关键字static 

 【C语言】static关键字详解_Anmia.的博客-CSDN博客

 #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;
}

 11.指针

 内存

 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地
址。

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。 

怎么取地址?

#include <stdio.h>
int main()
{int num = 10;&num;//取出num的地址//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)printf("%p\n", &num);//打印地址,%p是以地址的形式打印return 0;
}

 

 那地址如何存储,需要定义指针变量。

#include <stdio.h>
int main()
{int num = 10;int *p = &num;*p = 20;return 0;
}

以整形指针举例,可以推广到其他类型,如

#include <stdio.h>
int main()
{char ch = 'w';char* pc = &ch;*pc = 'q';printf("%c\n", ch);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;
}

32位                                                64位

那每个类型的指针大小一样,为什么要分类型呢?类型不同,表示你指向的类型不同,用不同与指向类型的指针会发生一系列错误,这些后面会讲,指针是C语言比较重要的内容,要对其认真深入学习。


12.结构体 

 结构体也是一种数据结构,但它是复杂的数据结构。对比之前的int float ......它们只能表达一种数据,如果要表达一个学生呢?学生有姓名,学号,年龄等信息又如何表示呢?

struct Student
{char name[20];//名字int age;    //年龄char sex[5];  //性别char id[15]; //学号
};

 我们定义了一个名为Student的结构体类型数据,它包含了name,age,sex,id几个不同的数据,它们用不同的类型表示。

#include <stdio.h>
struct Student
{char name[20];int age; char sex[5];char id[15];
};
int main()
{struct Student s = { "张三", 20, "男", "20230101" };//.为结构成员访问操作符printf("name = %s\nage = %d\nsex = %s\nid = %s\n", s.name, s.age, s.sex, s.id);//->操作符struct Student* ps = &s;printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps -> id);return 0;
}

 可见通过 . 或者 指针 ->都可以访问结构体中的成员。


 后言

 本篇,简单的点了一下C语言中大部分基础而重要的内容,不做多的详解,主要是面向新手,可以对C语言有个整体的框架认识,对后面学习可以起到一定的理解帮助。希望可以得到支持,后面会持续输出各项详解。

相关文章:

【C语言】初识C语言+进阶篇导读

✨个人主页&#xff1a; Anmia.&#x1f389;所属专栏&#xff1a; C Language &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 本篇目的是面向编程新手&#xff0c;没接触过编程的人。以及C进阶的导读。 内容是C语言重要知识点的简单解释&#xff0c;不做详解。给…...

wxWidgets学习笔记:wxListCtrl使用详解

使用案例 wxListCtrl中放21个item&#xff0c;每一行放两个item&#xff0c;每个item显示图标和名字&#xff0c;点击某个图标&#xff0c;该图标呈现响应状态并响应对应的事件 以下是使用wxListCtrl实现放置21个item&#xff0c;每一行放两个item&#xff0c;每个item显示图…...

酷炫的python日志库-loguru

Loguru是一个python的日志库&#xff0c;比logging更简单&#xff0c;好用&#xff0c;功能丰富。 GitHub - Delgan/loguru: Python logging made (stupidly) simple 安装 pip install loguru 特征 开箱即用&#xff0c;补样板没有处理程序&#xff0c;没有清理程序&#xff…...

html根据图片变换背景色

html根据图片变换背景色 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.item {width: 50%;height: 80vh;margin: 0 auto;border: 1px solid red;}</style> </head><body>…...

“深入探究JVM:揭秘Java虚拟机的工作原理“

标题&#xff1a;深入探究JVM&#xff1a;揭秘Java虚拟机的工作原理 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括JVM的架构、内存管理、垃圾回收机制以及即时编译等关键概念。通过详细解释这些概念&#xff0c;读者将能够…...

小程序的api使用 以及一些weui组件实列获取头像 扫码等

今日目标 响应式单位rpx小程序的生命周期 【重点】20%小程序框架 weui 【重点】 50%内置API 【重点】30%综合练习 1. 响应式rpx 1.1 rpx单位 rpx是微信小程序提出的一个尺寸单位&#xff0c;将整个手机屏幕宽度分为750份&#xff0c;1rpx 就是 1/750&#xff0c;避免不同手…...

海思ss928部署手写数字识别模型

大致流程--------------------------------------------------------------------------------------------------------------------- 模型转换---------------------------------------------------------------------------------------------------- 1&#xff1a;准备MNI…...

组学知识速递(五)|ChIP-seq知多少?

近段时间来&#xff0c;我们合作的ChIP-Seq技术发表的高分成功案例一篇接一篇&#xff0c;您是否心动了呢&#xff1f;本篇文章&#xff0c;总结了ChIP-Seq实验部分重点知识点&#xff0c;开启ChIP-Seq的你绝不要错过&#xff01; Q1 什么是ChIP-Seq&#xff1f; ChIP-Seq即染…...

2308C++内存序概略

参考 释放:在释放前的任意读写操作不能放在此操作之后. 获取:在获取后的任意读写操作不能放在此操作之前. 放松:只保证本操作的原子性,一般用于统计. 消费:在加载后的依赖本原子变量的,都不能重排在本操作之前. 获取释放:获取释放 序列一致,完全一致....

【C++】string的使用

1、string的使用 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;void Test1() {string s1;string s2("hello");cin >> s1;cout << s1 << endl;//strcat【字符串拼接】string ret1 s…...

Android 周期任务

AlarmManager使用 1.创建意图 // 创建意图&#xff0c;启动MonthlyTaskServiceIntent intent new Intent(getContext(), TimeTaskService.class); // 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,u…...

修改第三方组件默认样式

深度选择器 修改el-input的样式&#xff1a; <el-input class"input-area"></el-input>查看DOM结构&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…...

【游戏客户端】制作你玩我猜Like玩法

【游戏客户端】制作你玩我猜Like玩法 大家好&#xff0c;我是Lampard猿奋~~ “你画我猜”相信大家都不陌生&#xff0c;当初这款小游戏可谓茶余饭后必玩之选&#xff0c;风头一时无二。今天要和大家分享如何实现一个你玩我猜Like的玩法。 我们可以简单的把需求拆成两个个部分&…...

分页查询从接口到实现,统一对日期类型进行格式化处理

编写Service实现类编写Mapper的sql&#xff0c;但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…...

栈和队列详解(1)

目录 一、什么是栈&#xff1f; 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…...

苏州OV泛域名RSA加密算法https

RSA加密算法是一种非对称加密算法&#xff0c;它被广泛应用于信息安全领域。与对称加密算法不同&#xff0c;RSA加密算法使用了两个密钥&#xff0c;一个公钥和一个私钥。公钥可以公开&#xff0c;任何人都可以使用它加密信息&#xff0c;但只有私钥的持有者才能解密信息。RSA加…...

凯迪正大—微机继电保护校验仪

一、继电保护测试仪产品概述 KDJB-802继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件&#xff08;讨论稿&#xff09;》的基础上&#xff0c;听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代的微电子技术和器件实现的一种新…...

Linux文件属性与权限管理(可读、可写、可执行)

Linux把所有文件和设备都当作文件来管理&#xff0c;这些文件都在根目录下&#xff0c;同时Linux中的文件名区分大小写。 一、文件属性 使用ls -l命令查看文件详情&#xff1a; 1、每行代表一个文件&#xff0c;每行的第一个字符代表文件类型&#xff0c;linux文件类型包括&am…...

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059

这里咱们lrzsz命令,需要用来进行文件传输,因为如果不安装这个命令的话,那么 传输安装包什么的就不方便因为只有少数传输工具,才支持,直接拖拽的.没有的时候就可以用这个工具,用命令来传输 直接就是: sz 文件名 就可以把文件下载下来 rz 选择一个文件, 就可以把文件上传到当…...

酒吧座位全解析 小白必看

相信还有很多第一次去酒吧的朋友们还不了解吧台、散台、卡座的区分&#xff0c;下面我简单解说一下&#xff0c;如有错漏&#xff0c;欢迎指正&#xff01;一、吧台吧台是酒吧的核心部位&#xff0c;走进酒吧门&#xff0c;首先映入眼帘的就是吧台&#xff0c;一排人围着吧台几…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...