首页 > 其他分享 >C语言学习--重难点易错点

C语言学习--重难点易错点

时间:2024-09-13 11:16:29浏览次数:11  
标签:易错 -- scanf 运算符 重难点 int 数组 age 指针

  1. define 易错;只是全局替换
    image

在输入数据时候,遇到以下情况时,认为该数据结束①遇空格,或按回车,或跳格键;②指定宽度结束,如%3d;③遇非法输入

  1. 类型转换
    int i = 5;
    float f = i / 2;
    df: float f = (float)i / 2;
    注意上面的区别

C语言只有整型,实型(浮点精度值),字符型,
无逻辑型——bool

  1. printf的输出格式:
    | %? | 对应的变量类型 |
    | %c | char |
    | %d | int |
    | %f | float |
    | %s | string |
    | %-nd | int类型占n个位 ,-表示左对齐,不加默认右对齐 |
    | %m.nf | float占m位,m=0时不限制总位数。小数点后占n位 |
    | %0 | 0代表八进制输出 |
    | %x | x代表十六进制输出 |

对int i = 77; 若是077——八进制;0x77——十六进制
现在市面上的智能设备,几乎全是小端CPU,即小数在字节的左侧,00000在右侧,低位在前,高位在后

  1. scanf读取标准输入
    scanf(“%d”,&i);//一定要取地址
    fflush(stdin);//清空标准输入缓冲区
    scanf函数会返回输入成功地个数
    遇到scanf(“%c”),一般在%c前面加一个空格,除非是首位
    整形数0~128可以用%c输出为char类型
  2. 运算符与表达式
    总的运算符优先级由高到低:
    非、算数运算符、关系运算符、与或、赋值运算符;

非(!)→与(&&)→或(||) 谐音记为“飞鱼火”;
逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

一般括号是不加的,提供阅读速度
赋值运算符左边只能放变量
短路运算:
int i= 1;
i&&printf("xxxxx");

整除运算符/:多数C编译系统采取“向零取整”,5/3 = 1,-5/3 = -1;

sizeof()是一个运算符,不是函数!
机试时,如果需要数据校验,一般会提示的;不提示,说明不需要
6. 选择结构
if while 一般都加上{},防止出错
while 有终止条件while(a!=null),
没终止范围【m,n】--用for

大小写转换:
转换为小写:strlwr();
转换为大写:strupr();

  1. 数组
    *(a+i)引用数组元素的方法叫指针法,a[i]引用数组元素的方法叫下标法;

记住,只有用字符串初始化字符数组和(不管以什么形式初始化)数组长度超过字符串长的情况,才有“\0”。

⚠️要区分数组名a和指针p的区别,后者是指针变量,但前者a是指针常量,所以a++操作是行不通的。

char str[14];
str = "I am umbrellalalalala"; //数组名是地址,是常量,不能被赋值
str[] = "I am umbrellalalalala"; //这样赋值也是非法的
//如果是对单个数组元素赋值则没问题:str[0] = "I"

打印数组里的元素时,数组长度是传不过去的,需要额外加一个形参表示数组长度----》void print(int a[],int len ){}

字符数组:char c[10]={'a','b','c'};//这种方法很低效,所以又提供了
char c[10]="hello";//的高效方法
字符数组的空间刚好比元素打多一位就不会出现打印乱码的情况(多的一位用于‘\0’);
打印字符数组时,可不传长度,由while(c[i]){
printf("%c",c[i]); } 即可

scanf一般会忽略空格;所以可以使用gets(c),这就可以给c赋值空格--一次读取一行
puts(c)就是打印字符数组C
8. str系列(初试不重要,机试重要)
主要就是4个函数:strlen(c)--c的长度;
void strcpy(to,*from),从from数组复制给to
int strcmp(str1,str2),比较2个字符串;返回值为>=1,str1大于str2;为0,等长;为<=-1,小于str2(比较的依次是ASCII码值的大小;OJ系统不可直接返回strcmp,需要判断)
strcat(str1,str2),将str2拼接到str1上

  1. 指针系列
    int i;
    int *p;//代表一个int* 的地址,变量名是p
    &i;//取地址;
    *p;//取值

区分指针的其他概念
(1)指针和指针变量
指针就是地址本身,指针变量是存储地址的变量。

(2)重点区分int (* p)[4]和int * p[4]:
前者是指向包含四个元素的一维数组的指针变量;后者是指针数组,包含四个指向整型数据的指针元素。

直接访问和间接访问变量
image

如何想数组中存放数据?
一开始:for(int i=0; i<n ;i++){
scanf("%d",arr[i]);//错了!应该是&arr[i]
}

fgets(c,sizeof(c),stdin) 与 gets(c)的区别:fgets会在‘\0’前多加上‘\n’;
另外,注意,‘0’ 与 ‘\0’区别
字符数组尾部一般手动加上‘\0’,否则后面会乱码

指针的使用场景:传递和偏移,其他一般不用

传递:void change(int *p);
调用时:change(&i);//就可以修改实参的值
一般的change(int p); change(i);//不能修改实参的值

偏移:*(p+1)
int a[5] = {1,23,34,5};
int* p = a;//p指向a[0]
int j = p ++;//即为j=p; P++;

数组名作为实参传递给子参数时,是弱化为指针的
image

要在子函数中修改指针,必须将指针地址当成参数
要在子函数中修改变量,必须将变量地址当成参数

  1. 动态申请空间--堆空间,需要自行管理
    void * malloc();所以便于转换成不同类型的指针
    free(p);//释放空间,释放的p的地址是不能偏移的;所以可以用其他变量代替p进行操作
    p = NULL;//如果不把P置为NULL,则释放后的p成为野指针,c和C++是很忌讳的
    image

  2. 栈与堆的区别
    image

指针与数组赋值的区别;
指针不能修改某个元素,可以重新指定地址;数组可以修改个别元素(应该是C显性独有的),但不能整体修改
image

  1. 当gets与scanf同时出现的易错点
    先是scanf读取数据;再是gets读取数据;就需要在中间去除‘\n’、
    方法是:char c; scanf("%c",&c);//就可以去除‘\n’;_
    image

递归时,结束条件在递归公式前

  1. 结构体
    struct student{
    int age;
    char a[20];
    } student1,*s2;
    结构体大小是4的整数被——因为CPU取空间时是对齐的,所以计算结构体大小多是错误的(因为不一定是4的整数倍);
    之所以不能用 —— *s2.age;//是因为‘.’的优先级比*高
    而用:s2->age;//这个反而经常用

typedef int INTEGER;//typedef就是用来取别名的,有时用于‘变量名即注释’,有时为了快速开发简化某些步骤

p->age = (p).age的区别:
其中 p->age = (
p).age 就是一种语法,没有为什么
比如:英语里的 I am KK,你不能说成 I is KK.

(*p).age = st.age
上述代码有这样一行 p = &st; // p指向st
便有 p = st // 你可以理解“”运算符为打开

于是就出现了"->"运算符,实际上就是C语言提供的语法,就像数组a[1] = *(a+1) 一样

  1. C++引用
    C语言与C++语言关于形参的区别:
    cpp语言更容易修改实参,可以在形参中用&i,C语言并不可以!;C语言需要用指针,比较繁琐
    image

  2. 条件运算符&逗号运算符&位运算符
    a>b?a:b《--这就是条件运算符
    if(a,b){} 就是逗号运算符
    >>:右移,对于负数来说,偶数除2;奇数先-1,再除2;

  3. 补码
    无符号数,都是正数,必须如此--printf("\u",i);有符号数,如int,0代表+;1代表-
    负数的二进制是补码形式,1开头;补码就是用来表示负数的

标签:易错,--,scanf,运算符,重难点,int,数组,age,指针
From: https://www.cnblogs.com/fromWell888Dare/p/17228560.html

相关文章

  • 高数重难点知识
    常见反例的题目:反例需要积累原函数存在定理及拓展:定积分的结论4个常见不等式有意思的极限十字相乘法的进阶:反常积分的审敛法:123不好找等价函数,可以比较---》趋近于无穷的速度12的总结复杂函数的真题-例题:瑕积分+无穷积分反常积分易错点......
  • Markdown原始语法个人记录
    Markdown语法-个人记录官方教程链接标题#的个数来确定标题大小,#越少,标题越大;#和标题间最好用空格间隔以兼容,或在文字下方添加下划线、等号三级标题示例段落空行间隔来形成上下段落(为了更好兼容,段落开头不要用制表符、空格)段落示例换行行尾加两个以上空格后回车......
  • 考研数学概念性问题
    震荡的图像保号性的拓展保号性+定义常见的一些无穷大量的比较证3是可以直接用的公式符合函数的增减性,这次是图像理解,很好!(a+b+c)^2的使用标志:出现公式左右边的2个部分即可。理解这种凑法:+-需要的数......
  • 15. 三数之和 Golang实现
    给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。示例1:输入:nums=[-1,0,1,2,-1,-4]输出:[[......
  • 安卓手机和pad投屏电脑工具-scrcpy
    地址:https://github.com/Genymobile/scrcpy/blob/master/doc/macos.md mac安装步骤:1、brewinstallscrcpy第2步执行前需要在电脑上安装好adb,详情可见下面这篇随笔https://www.cnblogs.com/comeoncode/p/18392330  2、brewinstallandroid-platform-tools以上安装完......
  • 链表
    1、创建链表-无头结点#include<stdio.h>#include<malloc.h>#include<assert.h>typedefintElemType;//定义链表typedefstructListNode{ElemTypedata;structListNode*next;}ListNode;typedefListNode*PList;//初始化链表,让链表一开始指向为空v......
  • git常见问题Q&A
    git基本命令解释gitrestore--staged.:移除暂存区文件,不影响本地(撤销gitadd.操作)gitadd-u:将删除文件的操作同步到暂存区。将本地的删除同步到版本库(删除本地文件后执行,然后再gitpush)gitrm[-r]--cachedxxx:将文件或目录从git索引中删除,不影响本地文件。通常配......
  • mogodb学习
    安装MongoDB:直接官网安装即可。开启MongoDB服务:有2种方式:都是要去到bin目录下执行命令一是通过命令行:注意目录的形式执行成功后,会在保存数据库的目录:data/db中发现许多文件二是通过配置文件:先创建conf/mongod.conf配置文件的基本内容(用多了就会慢慢扩展):启动方式:mongo与m......
  • 高等数学--基础复习9到12章P121
    【九-1】多元函数的基本概念--平面点集内点;外点;边界点;连通集;等概念,考的不多【九-2】n维空间【九-3】多元函数的极限类比一元函数的极限【九-4】偏导数定义;怎么求;几何意义;偏导数存在与连续的联系【九-6】全微分【九-7】多元复合函数求导(理论讲解)【九-8】多元复合函数求导......
  • 温故而知新——方法引用&异常&File
    方法引用方法引用-01-方法引用概述方法引用的要求:方法引用-02-引用静态方法麻烦的是:如何找到或者创建需要的方法以进行引用这里的是:将字符串变成整形数字方法引用-03-04-引用其他类或者本类或父类的成员方法一般都是这样引用:newClass()::方法<--这个是对象引用成员......