C语言基础总结篇(究极避坑)

199 阅读4分钟

好买网(www.goodmai.com )IT技术交易平台

1.typedef:类型重命名

一切合法的变量名的定义(普通变量、指针变量、数组变量、函数指针、结构体)都可以用typedef转换成类型名

加typedef之前

int* PINT;			//指针变量
int Array[10];		//数组变量
void (*pfun)();		//函数指针
struct Student stu;	//定义结构体变量stu
struct Student *pstu;//定义结构体指针pstu

加上typedef之后

typedef int* PINT;			//PINT指针类型名
typedef int Array[10];		//Array数组类型名
typedef void (*pfun)();		//函数指针类型名
typedef struct Student stu;	//stu类型
	//使用stu s1;
typedef struct Student *pstu;	//结构体指针类型
	//使用:pstu p1 = NULL;

(1)给已有的类型名起别名

typedef unsigned short u_int16;
typedef unsigned int u_int32;
typedef unsigned double u_int64;

(2)对已有的声明,变量名的定义加上typedef 变成类型名

typedef int Arr[10];
int main()
{
    Arr a = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < 5; i++)
    {
        printf("%4d ", a[i]);
    }
    printf("\n");
}

结果:

image.png 结构体经典写法:


struct Student
{
    ...;
    
}stu, *pstu;

//这样是定义了stu结构体变量和pstu结构体变量指针

//前面加上typedef后
typedef struct Student
{
   ...; 
    
}stu, *pstu;
//stu便成了自定义的结构体类型
//pstu变成了自定义的结构体指针的类型

//从而可以使用该类型进行定义变量

2.请问p和q的类型

结果:

*和变量名结合,不是与类型名结合,所以p是int指针类型,q是int类型;

image.png

3.关键字sizeof

  1. sizeof是一个关键字,在编译期间确定类型和大小;

int main()
{
    int a = 0;
    int x;
    
    //在编译期确定
    x = sizeof(++a);
    //等价于x = 4;
    printf("a = %d\n", a);
    return 0;
}

//结果a = 0

  1. sizeof和strlen()的区别
  • 调用时机不同:sizeof是关键字,编译期间确定类型和大小

    ​ strlen()是函数,在运行期间调用函数

  • 功能不同:strlen()是专门计算字符串的长度;

    ​ sizeof在计算字符串所占用的空间大小;

int len = strlen(buff); //len = 10;
int size = sizeof(buff); // size = 11;

4、进制数转换的贪心算法 博客

5、c/c++的常变量不同侧重点 vs2019的全局变量未初始化默认为0,局部变量未初始化是随机值,使用该值编译不通过

c中的常变量侧重与"变量",不能使用常变量定义数组,编译期不通过;

c++中的常变量侧重于"常",可以使用该常变量定义数组;

C++常变量类似于宏,却有不同与宏

编译时期不同 与宏有所不同:宏在预编译时进行宏替换;使用常变量定义数组是在编译期进行确定的; 是否存在类型和占用空间 宏不存在类型,不占用空间 常变量有类型,占用空间 安全性 宏不存在类型,没有类型检查,不安全 常变量有数据类型,有类型检查,比较安全 6、’ ’ 和" " ’ ‘是字符的定界符, 在’前面加上\后转义变成单引号字符–》\’

例如:

char ch = '\'';	//true

""是字符串的定界符

7、ascii码值

image.png 8、转义字符 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgEV0wBA-1635073955443)(C:\Users\小小怪咯\AppData\Roaming\Typora\typora-user-images\image-20211023164550726.png)]

9、关于0 ‘0’ ‘\0’

image.png

{
    char cha = 0;		//ASCII值为0对应的字符就是空字符
    char chb = '0';		//字符0对应的ASCII值48
    char chc = '\0';	//等于cha == 》空字符
    char chd = ' ';		//空格字符ascii值是32
	return 0;    
}

10、关于\000 和\xff

\000将八进制数000转换成十进制对应的ascii码值,码值对应的字符;

  • 其中八进制数有效范围000~377,因为char一字节最大取值255,其对应的八进制数就是377;八进制数超出该范围编译器就会报错
//八进制的141转换成十进制的97	//pzjahello
//如果是"pzj\1411hello"	//pzja1hello
//如果是"pzj\148hello"		//只会转义\14因为8超出0~7
//如果是"pzj\889hello"		//此时的\就会被省略
	
int len = strlen(str);				//len = 9