序言

本文主要用于记录一些C语言的知识点/tips

知识点

  • 连等
    C中可以:

    1
    2
    int a,b,c,d;
    a=b=c=d=10;

    不可以:

    1
    int a=b=c=d=10;
  • 语句和表达式的区别

  • 字符串数组末尾有’\0’
    整型数组末尾无’\0’

  • bit是位 是指为0或者1。 byte是指字节,一个字节 =八个位.

  • 编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。

  • 在函数中不可以再定义函数。

  • 算法的是一定要有输出的,他可以没有输入。

  • 关键字不可以作为用户标识符号。main define scanf printf都不是关键字。

  • 2.333e-1就是合法的,且数据是2.333×10-1。­
    考试口诀:e前e后必有数,e后必为整数。

  • ‘0’的ASCII数值表示为48,’a’的ASCII数值是97,’A’的ASCII数值是65。

  • 转义字符的考查:­
    在程序中 int a = 0x6d,是把一个十六进制的数给变量a注意这里的0x必须存在。 ­
    在程序中 int a = 06d,是一个八进制的形式。
    ­

  • 在转义字符中,’\x6d’才是合法的,0不能写,并且x是小写。
    ­‘\141’是合法的, 0是不能写的。­

  • %符号两边要求是整数。不是整数就错了。­

  • scanf(“%d%d%*d%d”,&a,&b,&c);跳过输入的第三个数据。­(存疑)

  • char a = getchar()是没有参数的,从键盘得到你输入的一个字符给变量a。­

  • 逻辑表达式:­
    只能为1(表示为真),或0(表示假)­

    • 共有&& || ! 三种逻辑运算符号。­
    • !>&&>|| 优先的级别。­
    • 注意短路现象。考试比较喜欢考到。­
  • while((c=getchar())!=’\n’) 和 while(c=getchar() !=’\n’)的差别­(!= 的优先级高于 =)
    因此第二个c=1或0

  • a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。­
    a是一维数组名,所以它是列指针,也就是说a+1是跳一列。 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void f(int (*p)[3])//这个函数只能输出3列的二维数组
    //(*p)[3] 中 (*p)是*(*p)的地址
    {
    printf("%d %d %d %d %d",
    *(*p), //a[0][0]
    *(*p+1), //a[0][1]
    *(*p+1)+2, //a[0][1]+2
    *(*(p+1)+2), //a[1][2]
    *(*p)+1); //a[0][0]+1

    }
    int main()
    {
    int a[2][3]={10,20,30,40,50,60};
    f(a);
    }

    茴香豆的“茴”有几种写法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "stdio.h"
    int main()
    {
    int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{123}};
    printf("%d",*(*(a+2)+1));
    printf("%d",(*(a+2))[1]);//输出8 此处[1]是行地址的偏移1([]是取值操作)
    printf("%d",*(a+2)[1]);//输出123 此处[1]是列的地址偏移1([]是取值操作
    printf("%d",a[2][1]);
    }
  • 数组的初始化问题

  • 字符串的 strlen() 和 strcat() 和strcmp() 和strcpy()的使用方法。他们的参数都是地址。其中strcat() 和strcmp()有两个参数。

  • strlen 和 sizeof的区别;

  • define f(x)(xx) 和 define f(x) xx 之间的差别。一定要好好的注意这写容易错的地方,替换的时候有括号和没有括号是很大的区别。

  • int *p;
    p = (int *)malloc(4);
    p = (int *)malloc(sizeof(int));以上两个等价
    当心填空题目,malloc的返回类型是 void *

  • 函数的递归调用一定要记得有结束的条件,并且要会算简单的递归题目。要会作递归的题目

  • 结构体和共用体以及链表要掌握最简单的。typedef考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。

  • 两种重要的数组长度:
    char a[]={‘a’,’b’,’c’};  数组长度为3,字符串长度不定。sizeof(a)为3。
    char a[5]={ ‘a’,’b’,’c’}  数组长度为5,字符串长度3。sizeof(a)为5。
    String = a,b,c 字符串长度为四,包括终止符’0’.

  • scanf 和 gets的数据:
    如果输入的是 good good study!
    那么scanf(“%s”,a); 只会接收 good. 考点:不可以接收空格。
    gets(a); 会接收 good good study! 考点:可以接收空格。

  • 字符串的赋值
    C语言中没有字符串变量,所以用数组和指针存放字符串:
    1、char ch[10]={“abcdefgh”}; 对
    2、char ch[10]=“abcdefgh”; 对
    3、char ch[10]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’}; 对
    4、char *p=“abcdefgh”; 错
    5、char *p; 错
    p=“abcdefgh”;
    6、char ch[10]; 错了!数组名不可以赋值!
    ch=“abcdefgh”;

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    #include <string.h>

    int main() {
    char a[4]; // 需要足够的空间存放字符串"vbn"和终止符'\0'
    char* p = a;
    strcpy(p, "vbn");//字符串得这样赋
    puts(p);
    /*
    char a[45]= "vbn";
    char* p=a;
    puts(p);
    */

    /*
    char a[45];
    strcpy(a,"fghj");
    puts(a);
    */
    return 0;
    }
  • 字符串赋值的函数:
    1、while( (*t=*s)!=null ){s++;t++;}
    2、while( *t=*s ){s++;t++;}
    3、while( *t++=*s++);

  •  int *ptr = new int; // C++
     // 或者
     int *ptr = (int*)malloc(sizeof(int)); // C
    
    1
    2
    3
    4
    - 注意一些
    ``` c
    x=1;
    if(x=2) ……;//x=2 x==2
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "iostream"
    using namespace std;
    int main(){
    int i,b,k=0;
    for(i=1;i<5;i++)
    {
    b=i%2;
    while(b-->=0){
    k++;
    }//注意循环语句的嵌套
    }
    cout<<k<<','<<b;
    }

    6,-2

tips

ASCII相关

C语言输出ASCII 219无法显示方格
SetConsoleOutputCP函数功能:用于设置控制台程序输出代码页。代码页是字符集编码的别名,也有人称”内码表”。
在程序中编写 SetConsoleOutputCP(437)这行代码才能正常显示128后面的ASCII值。

1
2
3
4
5
6
7
8
#include "windows"//注意

int main()
{
SetConsoleOutputCP(437);
.........
return 0;
}