C语言基础

一、进制之间的转换

二进制的基数是0、1

十进制是0-9

八进制是0-7,用0表示

十六进制0-9、a-f,用0x表示

二、运算符

1、算数运算符:+ - * / % ++ --

%:小数没有于数

/:整除取整

2、赋值运算:= += -= /= %= &=

1) int b = ++a;//4  ++在前,先自加再赋值
2) int b = a++;//3  ++在后,先赋值再自加

3、关系运算:> < >= <= == !=

c语言:非0为真,0为假

4、逻辑运算符

&&(逻辑与):全真则真,一假则假
||(逻辑或):一真则真,全假则假

!(逻辑非)非真即假,非假即真

截断法则:
逻辑或运算中:如果前面的表达式为真,则后面的表达式不执行
逻辑与运算中:如果前面的表达式为假,则后面的表达式不执行  

5、位运算符& | ^ ~ << >>

&(位与):全1则1,有0则0
|(位或):有1则1,全0则0

^(异或):不同为1 , 相同为0

~:取反(通过补码进行操作)按位取反 0-1

6、三目运算符

判断表达式1是否成立,成立执行表达式2,在执行表达式3,循环执行表达式2,

a>b?a:b;

三、变量

1、概念:在程序运行中发生变化的量

2、定义格式:存储类型    数据类型        变量名
    (auto)    int a;

3、数据类型        

       名称        字节        取值范围(了解)
char    字符型        1字节        -2^7 ~ 2^7-1
short     短整型        2字节        -2^15 ~ 2^15 -1
int    整形        4字节        -2^31 ~ 2^31 -1
long     长整型        4字节        -2^31 ~ 2^31 -1
float    单精度浮点型    4字节        有效数据6-7位
double    双精度浮点型    8字节        有效数据15-16位

4、变量分类:

局部变量、全局变量的区别?(面试题)
                              局部变量                                                  全局变量
1. 定义位置:    函数体内部                                            函数体外部
2. 初值:        未初始化时,值为随机值                         未初始化时,值为0
3. 存储位置:       栈区                                                   全局区
4. 生命周期:    同函数体共存亡                                    同整个程序共存亡
5. 作用域:        作用于函数体内部                                作用于整个程序

四、常量

概念:程序运行中不会发生变化的量被称为常量

1、字符型常量

用' '括起来
'a'  -> 字符a
a-> 变量'\0' ' ' '\n' '\x41'    '\101'  'A‘

2、标识常量

宏定义:起标识作用,遵循标识符的命名规则一般大写表示

格式:#define 宏名  常量或表达式
特点:只能单纯替换,不要进行手动运算(原样替换,替换完再计算)

五、输入输出

1. 按字符输入输出

int getchar(void);
功能:从终端输入一个字符
参数:无
返回值:输入字符的ASCII值

int ch = getchar();//ch里面存放的是输入字符的ascii值
getchar();

1、按格式输入输出
int printf(const char *format, ...);
功能:按照指定格式向终端输出
参数:format:字符串  "hello world"
格式:
"%d"   int
"%f"    float
"%lf"    double
"%c"    char
"%s"    字符串
"%#x"    十六进制
"%#o"    八进制
"%p"    地址
"%e"    指数
"%-m.n"   含义:
.n:打印小数点后几位
m:位宽
-:左对齐,默认右对齐

2、int putchar(int c);

功能:向终端输出一个字符
参数:c:要输出字符的ASCII值
返回值:要输出字符的ASCII值

putchar(10);//putchar('\n');
putchar('a');//putchar(97);

3、垃圾字符回收

1. 通过空格回收
可以回收一个或多个的空格、回车、tab
2. %*c
只能回收任意一个字符
3. getchar()
只能回收任意一个字符,一般用于循环里面

4、强制转换

int a=5;
float b=(float)a/2;//2.500000

六、分支语句

1、基本结构

if(表达式)
{
语句块1;
}
else
{
语句块2;
}

2、分层结构

if(表达式1)

{

语句块1;

}

else if(表达式2)

{

语句块2;

}

else

{

语句块3;

}

3、嵌套结构

if(表达式1)

{

if(表达式2)

{

语句块2;

}

else

{

语句块3;

}

}

else

{

语句块1;

}

执行顺序:首先判断表达式是否成立,如果成立就执行语句块1,否则执行语句块2

总结:

  1. if后面可以没有else,但是else前面必须有if
  2. if和else后面{}可以省略,但是只能匹配之后的一条语句

 4、基本结构:

switch_case
基本结构:
switch(变量或表达式)
{
    case 常量1:语句块1;break;
case 常量2:语句块2;break;
case 常量3:语句块3;break;
...
    case 常量n:语句块n;break;

    default:语句块n+1;
}

        七、循环

1、for循环

1.1、基本结构

for(表达式1;表达式2;表达式3)

{

语句块;

}

表达式1:赋初值

表达式2:循环的终止条件

表达式3:增值或减值

执行顺序:

首先执行表达式1进行赋值,然后判断表达式2是否成立,如果成立就进入循环执行语句块,再执行表达式3进行增值或减值然后继续判断表达式2是否成立,直到表达式2不成立退出循环

1.2、嵌套结构

for(表达式1;表达式2;表达式3)

{

for(表达式4;表达式5;表达式6)

{

语句块;

}

}

变形一:

int i=0;

for(;表达式2;表达式3)

{

语句块;

}

变形二:

int i=0;

for(;表达式2;)

{

语句块;

表达式3;

}

变形3:

int i=0;

for(;;)//死循环

{

if(表达式2)

{

语句块;

表达式3;

}

else

{

break;

}

}

八、函数

1. 定义:一个完成特定功能的代码模块

2. 三要素:功能、参数、返回值

3. 格式:

存储类型  数据类型  函数名(参数列表)
{
    函数体;
}

1) 没有参数:参数列表可以省略,也可以用void
2) 没有返回值:数据类型为void,函数内部没有return 语句。
3) 有返回值:要根据返回值的数据类型定义函数的数据类型
4) 定义子函数时可以直接定义在主函数上面,如果定义在主函数下面需要提前声明函数

4. 函数声明:

数据类型        函数名(参数列表);//形参

5. 函数调用

(1) 没有返回值:直接调用:函数名(实参);//
(2) 有返回值:如果需要接受返回值,就要定义一个与返回值类型相同的变量接收,如果不需要接收返回值,就直接调用函数

6. 函数传参

(1) 值传递:
单向传递,将实参传递给形参使用,改变形参实参不会受影响
(2) 地址传递
双向传递,在函数中修改形参,实参会随之变化
   (3)数组传递
    和地址传递一样,参数中存在数组的定义,他也认为是指针

九、开辟堆区空间

1、开辟空间

#include <stdlib.h>
       void *malloc(size_t size);
功能:在堆区开辟空间
参数:size:开辟空间的大小(单位:字节)
返回值:
    成功:返回开辟空间的首地址
    失败:NULL;

2、释放空间

#include <stdlib.h>
       void free(void *ptr);
功能:释放堆区空间
参数:ptr:堆区空间首地址
返回值:无
free(p);
p=NULL;

总结:如果在子函数中开辟堆区空间,
想在主函数中拿到堆区空间首地址有两种方法:

1. 通过返回值
char * fun()
    {
        char *p = (char *)malloc(32);
        strcpy(p, "hello");    
        return p;
    }
    int main()
    {
        char *m = fun();
        printf("%s\n",m);
        free(m);
        m = NULL;
        return 0;
}

2. 通过传参
void fun(char **p)//&m
    {
        *p = (char *)malloc(32); // m
        strcpy(*p, "hello");    
    }
    main()
    {
        char *m = NULL;
        fun(&m);
        printf("%s\n", m);
        free(m);
        m=NULL;
        return 0;
    }

十、string函数族

1. strcpy

#include <string.h>
       char *strcpy(char *dest, const char *src);

功能:实现字符串复制
参数:char *dest:目标字符串首地址
    const char *src:源字符串首地址
返回值:目标字符串首地址
复制包括\0

char *strncpy(char *dest, const char *src, size_t n);
功能:实现字符串复制
参数:char *dest:目标字符串首地址
    const char *src:源字符串首地址
    size_t n:字符的个数
返回值:目标字符串首地址

2. strlen

#include <string.h>
       size_t strlen(const char *s);
功能:计算字符串的实际长度
参数:s:字符串首地址
返回值:实际长度

3. strcat

#include <string.h>
       char *strcat(char *dest, const char *src);
功能:用于字符串拼接
参数:char *dest  目标字符串首地址 const char *src  源字符串首地址
返回值:目标字符串首地址

char *strncat(char *dest, const char *src, size_t n);
拼接src的前n个字符

4. strcmp

#include <string.h>
       int strcmp(const char *s1, const char *s2);
功能:用于字符串比较
参数:s1 s2用于比较多字符串
返回值:
从字符串首个字符开始比较字符ASCII的大小,如果相等继续向后判断

判断大小
1      s1>s2
 0      s1== s2
  -1      s1<s2

int strncmp(const char *s1, const char *s2, size_t n);
比较两个字符串前n个字符的大小

5、递归函数

1. 定义:自己调用自己
2. 执行过程分为两个阶段
1) 递推阶段:从原问题出发,按递推公式从未知到已知,最终到达递归终止条件
2) 回归阶段:按递归的终止条件求出结果,逆向逐步带入递归公式,回到原问题求解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值