c语言学习(基础知识后半部分)

目录

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

6.选择语句

7.循环语句

8.函数

9.数组

10.操作数

10.1算术运算符

10.2移位操作符

10.3赋值操作符

        10.3.1单目操作符

        10.3.2 双目操作符

        10.3.3 三目操作符

10.4复合赋值符

10.5 关系操作符---比较两数直接大小之类的一些关系

10.6 逻辑操作符

10.7 逗号表达式 --- 逗号表达式的运算过程为:从左往右逐个计算表达式。

10.8 下标引用、函数调用和结构成员

11.常见关键字

11.1关键字typedef

11.2 关键字static

12.define定义常量和宏

13.指针

14.结构体



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

5.1字符串

"双引号里的东西都叫字符串"--这也是字符串。

注意:字符串结束标志是一个'\0'的转义字符,在计算字符串长度时'\0',是结束标志,不算做内容,但占用实际内存。比如:arr[5] = "hello"是不行的,因为'\0'没有放入应将数组开到arr[6] = 'hello'才行。

 问题出在了arr2没有加'\0',因为没有结束标志,printf中的%s(字符串类型)会一直往下跑,就会出现后面烫烫烫的乱码

接下来我们来求一下arr1和arr2两个数组的长度

 我们发现arr1为3就是abc这三个数据,而arr2为什么是15呢?

因为arr2这个数组数完a,b,c三个数后,没有找到\0,所以他就一直往后走,直到在第15位的后面找到\0才停止,arr2的这个长度是不确定的,是多少都有可能。

如果我们在arr2中加入'\0',则得数为两个3。

这里我们要区分'\0',0,'0'这三种零

'\0'为字符串结束标志,是转义字符,ASCII码值为0

0为数字零,ASCII值也为0,但两者不同,一个是字符,一个是数字

'0'为数字字符零,ASCII码值为48,与’a‘,'b','c'这些字母字符一样,是字符。

5.2 转义字符

\? 在书写连续多个问号时使用(打印?),防止被解析成三字母词 //新版本编译器用不到

\' 用于表示字符常量(打印')

\" 用于表示一个字符内部的双引号(表示打印出来的")

\\ 打印\

\a 警告字符,蜂鸣

\b 退格符

\f 进纸符

\n 换行

\r 回车

\t 水平制表符(相当于tab键)

\v 垂直制表符

\ddd ddd表示1-3个八进制数字  ddd作为8进制代表的十进制数字所代表的ASCII值对应的字符

如:32(8进制)-->20(10进制)-->   ->(作为ASCII码值代表的字符)

\xdd dd表示2个16进制数字

5.3注释

1.代码中有不需要的代码可以直接删除,也可以注释掉。

2.代码中有些代码比较难懂,可以加一下注释文字

//为单行注释

/* 注释内容 */为多行注释

vs注释的快捷键

按下Ctrl + K + C 注释
按下Ctrl + K + U 取消注释

便于更好的对应ASCII码值,我把表放过来

注意:字符串比较不能用==比较,要用string.h头文件里的函数strcmp进行比较

6.选择语句

#include<stdio.h>
int main()
{
	int coding = 0;
	printf("要不要好好学习c语言?(要(1)不要(0))\n");
	scanf("%d", &coding);
	if (coding == 1)
	{
		printf("坚持,你会得到offer");
	}
	else
	{
		printf("有人考上北大,有人考上清华,你烤上地瓜,麻麻,我想吃烤山药");
	}
	return 0;
}

if为选择语句,括号内的为条件,如果有其他条件要用else if,结尾为else代表除了if和else if之外的剩余语句条件

7.循环语句

听说敲20000行有效代码会成为一个合格的程序员

因为连续打20000行代码比较麻烦,所以可以运用循环语句减少代码重复

#include<stdio.h>
int main()
{
	int line = 0;
	printf("加入大厂\n");
	while (line < 20000)
	{
		printf("敲一行代码:%d\n",line);
		line++;
	}
	if(line>=20000)
		printf("成为大牛");
	return 0;
}

while语句-讲解

for语句(后期讲)

do while语句(后期讲)

8.函数

自定义函数(函数的特点就是简化代码,代码复用)

#include<stdio.h>
int Add(int x, int y)
{
	int s = x + y;
	return s;
}

int main()
{
	int num1 = 10;
	int num2 = 20;
	int sum = 0;
	int a = 100;
	int b = 200;
	//sum = num1 + num2;  因为写了两次操作基本相同,所以我们想到用函数,减少语句重复。
	sum = Add(num1, num2); 
	printf("sum = %d\n", sum);
	//sum = a + b;
	sum = Add(a, b);
	printf("sum = %d\n", sum);
	return 0;
}

9.数组

创建出的数组有其对应的下标,规定下标从0开始。

下标是为了更好的访问数组中的元素

#include<stdio.h>
int main()
{
	int a = 100;
	int b = 200;
	int c = 300;
	int d = 400; //这样定义同种类型变量会感觉很挫,所以出现了数组,可以定义多个同种类型数据放在一个集合中,叫做数组
	int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个存放10个整数的数组;
	printf("%d\n", arr[4]); // 下标的形式访问元素
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]); //打印整个数组的值;
		i++;
	}
	//char ch[20];
	//float f[10];
	return 0;
}

数组的创建长度要用常量!

arr[常量] 里面不可以用变量,如:int n = 10;arr[n]是错误的,但const int n = 10;arr[n]就是对的,因为const是常变量类型;

10.操作数

简单介绍,后面文章重点讲。

10.1算术运算符

+  -  *  / 

%(取模)---取余数,如:10%3 == 1;

10.2移位操作符

>>(右移)  <<(左移)  移位移的是二进制位

  主要运用:右移1位相当于除以2

如:2(二进制0000000000000010) >> 后为 1(二进制0000000000000001)

左移是,最前面一位踢出,尾部补0

位操作符(二进制位操作)

&(按位与)同真且为真  |(按位或)同假或为假  ^(按位异或)对应二进制位相同为0,相异为1

相当于高中数学里的且和或,1代表真,0代表假

10.3赋值操作符

10.3.1单目操作符

如:!(否定运算符,如果本身为真,加上!后其值变为假)

-(取负值)

+(取正值)

&(取地址)

sizeof(操作数的类型长度)

运用计算数组个数:sizeof(arr) / sizeof(arr[0])  个数=数组总大小 / 每个元素的大小

~(对一个数的二进制按位取反)如0(00000000000000000000000000000000)将它取反~0为-1(11111111111111111111111111111111)

//原码、反码、补码------原码  所有二进制位取反->反码  +1-> 补码

负数在内存中存储的时候,存储的是二进制的补码,但我们打印的时候打印的是原码

所以11111111111111111111111111111111---补码要转换为原码先减1,再取反。

11111111111111111111111111111110---反码

10000000000000000000000000000001 --- 原码

其中第一位是符号位,负数为1,正数为0,正数反码==原码,负数反码==原码除符号位全部取反

为什么是-1呢,因为超过整型的最大值,范围循环所以就到了-1.

++(将其本身值加一)有前置(先++,再打印)和后置(先打印,再++)两种

--(将其本身值减一) 有前置(先--,再打印)和后置(先打印,再--)两种

关于++和--我给个例子,大家看一下,前置跟后置的区别

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

 答案为10和12;

这就是前置(先++,再打印)和后置(先打印,再++)的意思。

*(间接访问操作符(解引用操作符--运用于指针))

(类型)  强制类型转换,如: double a = 5.0; int c = (int)a;将a强行转换为int类型提供给c

10.3.2 双目操作符

两者之间的加减乘除和比较

10.3.3 三目操作符

条件操作符:exp ? exp2 : exp3;

条件 ? 符合条件答案 : 不符合条件答案 (有点像选择语句)

"目"  是操作数个数

=(在这里区分一下=(赋值)和==(判断等于))

10.4复合赋值符

+= 举个例子 i += 2  相当于 i = i + 2; 在它本身的基础上做加法  

-=  *=  /=  &=  ^=  |=  >>=  <<=  这些类比上面的加等于操作.

10.5 关系操作符---比较两数直接大小之类的一些关系

>

>=

<

<=

!=  用于测试不相等

== 用于测试相等

10.6 逻辑操作符

&&  逻辑与(也叫短路与)

A&&B, 当A为false时,不去计算B的值而直接返回false;当A为true时,计算B的值。

||  逻辑或(也叫短路或)

当运算符“||”的左边为true时,右边的表达式就不会进行运算;当左边为false时,计算右边的值。

10.7 逗号表达式 --- 逗号表达式的运算过程为:从左往右逐个计算表达式。

exp1 , exp2 , exp3 , ......expN;

10.8 下标引用、函数调用和结构成员

[]  ()  .  -> 

11.常见关键字

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

注:关键字,先介绍下面几个,后期遇到后会再讲解

11.1关键字typedef

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

如:

将unsigned int 重命名为uint_32,所以uint_32也是一个类型名

#include<stdio.h>
typedef unsigned int uint_32;
int main()
{
    //观察num1和num2,这两个变量的类型是一样的
    unsigned int num1 = 0;
    uint_32 num2 = 0;
    return 0;
}

11.2 关键字static

在c语言中

static是用来修饰变量和函数的,变成静态变量后被所有数据所共享

1.修饰局部变量--静态局部变量(会使局部变量生命周期变长)

2.修饰全局变量--静态全局变量(会使全局变量只能在本身所在的源文件内使用)

3.修饰函数--静态函数(改变了函数的链接属性  从外部链接数学->内部链接属性)

12.define定义常量和宏

#define定义标识符常量

#define MAX 1000

#define定义宏--带参数

比如:求最大值可以#define MAX(X,Y)  (X > Y ? X : Y)

13.指针

        内存

内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。

所以为了有效的使用内存,就把内存分成一个个小弟内存单元,每个内存单元的大小是1给字节。

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被成为该内存单元的地址

#include<stdio.h>
int main()
{
	int a = 10; //4个字节
	int* p = &a; //取地址
	printf("%p\n", &a);
	printf("%p\n", p);
	//有一种变量使用了存放地址的---指针变量
	*p = 20; //*-解引用操作符
	printf("a = %d\n", a);
	return 0;
}

 

 指针变量的大小

指针里面存的地址,地址占32或64个二进制位,一个二进制位占一个bit,32个二进制位占32个bit,也就是4个byte;

指针大小在32位平台是4给字节,64位平台是8给字节。

14.结构体

结构体是c语言特别重要的知识点,结构体是的c语言有能力描述复杂的类型。

比如:描述学生,学生包含姓名,学号,年龄,性别这些信息。

但c语言中没有给出学生的数据类型,所以,我们就需要用到结构体来构造学生类型

#include<stdio.h>

struct Stu //结构体类型名
{
    char name[20]; //姓名
    int age; //年龄
    char sex[10]; //性别
    char id[20]; //学号
};  //结构体创建
int main()
{
    //利用结构体类型创建一个该类型的结构体变量
    struct Stu s1 = {"小马", 18, "男", "000001"}; //结构体初始化
    printf("姓名:%s\n", s1.name);
    printf("年龄:%d\n", s1.age);
    printf("性别:%s\n", s1.sex);
    printf("学号:%s\n", s1.id);
    s1.age = 20;
    printf("修改后的年龄:%d\n", s1.age);
    return 0;
}

结构体创建了,那指针指向结构体类型的话,指针应该怎么写?

答案显然,因为指针要对应指向数据的类型,所以指针指向上图学生结构体的话为:

struct Stu *p = &s1;

那如何用指针打印出学生的姓名,年龄呢

printf("%s\n",(*p).name);  这么写会不会决定程序冗杂,很容易绕晕,所以c语言给了->操作符

printf("%s\n",p->name);与上式相等,我们用指针p->(指向) name;

下一章我们准备重点学习分支和循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值