c语言相关知识点
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
数据存储方式
原创 2021-02-26 13:20:50 · 190 阅读 · 0 评论 -
进制转换
十进制转二,八,十六进制二,八,十六进制转十进制二进制转八和十六进制八和十六进制转二进制原创 2021-02-26 11:26:42 · 98 阅读 · 0 评论 -
scanf具有的安全隐患
如果存储空间不足,数据能被存储到内存中,但不被保护,printf打印输出字符串是在遇到\0结束,而非根据字符串大小输出原创 2021-02-26 10:32:05 · 271 阅读 · 0 评论 -
实型(浮点型---float,double)以及printf输出一些注意事项
float和double区别: float:2^23 = 8388608,共七位,意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。默认输出都是小数点后六位控制输出格式:%.mf--------只输出小数点后几位的数字,而且会进行四舍五入的操作控制输出符%m.nf-------m可以用来控制输出的数字所占据的位数,位数涵盖小数点原创 2021-02-25 20:12:47 · 13057 阅读 · 2 评论 -
无符号整型和有符号整型的区别,以及无符号整型的使用
有符号整型:无符号整型:注意:无符号数据表示数量,只有正值unsigned无符号标识不会改变数据类型的字节大小无符号型数据打印要将之前的%d,全部替换成%u,如果在vs中没有注意转换,将无符号型用%d输出,那么编译器会做优化,将无符号型按有符号型进行输出,优化的前提是不写成:unsigned int a = -10u;在数据后面加了u,如果前面写了负号就会报错,因为明确了这是一个无符号整型如果用%u输出一个负号整型,会出现乱码有符号型前面一般不写signed在定义变量原创 2021-02-25 18:25:25 · 34920 阅读 · 4 评论 -
指针叠加会不断改变指针指向
下面是错误的代码演示:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>void test(){ //指针叠加会不断改变指针指向 //指针p一开始指向堆区开辟内存的首地址 char* p = (char*)malloc(sizeof(char)*20); char buf[] = "hello"; int len = strlen(.原创 2021-02-23 14:45:29 · 331 阅读 · 0 评论 -
枚举
1.如果自己不去给枚举值赋初值,就自动从0开始定义#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>//枚举enum WEEKDAY { ri, yi,er,sa,si,wu,li};void test(){ printf("%d ",ri); printf("%d ", yi); printf("%d ", er); p.原创 2021-02-17 17:20:45 · 177 阅读 · 0 评论 -
共用体(联合体)
概念:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>//联合体:数据都储存在一块内存上,内存上的数据取决于最新赋值的内存上的数据union Data { int a; short b; char c;}d;void test(){ d.a = 10; //打印结果都是10,说明数据都存储在一块内存上 //同一块内存空间原创 2021-02-17 16:36:12 · 124 阅读 · 0 评论 -
const修饰结构体指针
第一种指针指向值不能改变,指针指向可以改变的另一种写法:struct student const* p1=&s1;原创 2021-02-17 13:46:07 · 1045 阅读 · 0 评论 -
结构体创建在堆区
char name无法修改里面字符的问题:*#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//结构体嵌套struct stu { int num;};struct teacher{ const char* name; //字符串指针 //char name[64]; int age; stu t;}t1;void test(){ //字符串指针指向字面常量 t1原创 2021-02-17 13:31:52 · 1411 阅读 · 0 评论 -
同级指针修饰内存失败以及解决方法
此时p还没指向任何空间,直接解引用赋值会报错如果要是地址传递应该传入&p,即p的地址解决上述问题方法1:利用函数返回值方法2:高级指针修饰低级指针本质是地址传递,同级指针是值传递问题1:如果在allocatespace函数里面释放了pp指针指向的内存空间,再p=2000会报错吗?答案:会的这里运行之所以没有报错,是因为这块内存虽然权限还给了操作系统,但还未拿给其他程序使用,因此我们依然可以操控这块内存这里是值传递,因此p1置空,和p没有关系,有关系的只是两者指向的.原创 2021-02-17 11:28:49 · 306 阅读 · 0 评论 -
内存四区,malloc,内存操作注意事项
内存四区注意内存小于4个字节,会放入寄存器上malloc函数注意:在堆区开辟内存的时候,内存就已经随机赋值了,因此可以用memset清空内存内存操作注意事项1.不要返回局部变量的地址vs编译器会先保留一次局部变量地址,防止程序员误操作内存已经被释放,再操作属于非法行为解决方法:返回静态变量,静态变量生命周期直到程序结束2.不要操作已经释放的内存空间不能再释放后*p=2000;再次操作释放的内存空间free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,原创 2021-02-16 22:04:45 · 302 阅读 · 0 评论 -
内存操作函数之memmove和memcmp
memmove函数需求:将1234拷贝到3456 拷贝完显示121234#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<memory.h>int main(){ char ch[64] = "123456"; //利用memcpy函数可以实现操作: memcpy(ch + 2, ch, 4 * sizeof(char)); printf("%s\n", ch); return 0;}原创 2021-02-16 20:01:05 · 562 阅读 · 3 评论 -
内存操作函数之memset和memcpy
memset函数包含头文件:string或者memoryextern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:cha原创 2021-02-16 18:35:25 · 2370 阅读 · 8 评论 -
静态函数和全局函数
全局函数不同文件下,也可以调用,通过extern关键字声明后静态函数只能在当前文件下使用原创 2021-02-16 14:10:11 · 680 阅读 · 0 评论 -
普通全局变量,静态局部变量,静态全局变量
普通全局变量:静态局部变量:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void func(){ static int b = 10; b++; printf("b=%d\n", b);}void test(){ static int a = 10; printf("a=%d\n", a); //静态局部变量b只会默认初始化一次 //多次调用func函数时,会跳过b的初始化代码,执行下一行++操作 func(原创 2021-02-16 13:47:29 · 506 阅读 · 0 评论 -
c语言二维数组
初始化和打印方式:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void test(){ //赋值打印方式 //1. int arr[2][3]; arr[0][0] = 1; arr[0][1] = 2; arr[0][2] = 3; arr[1][0] = 4; arr[1][1] = 5; arr[1][2] = 6; //2. int arr1[2][3] = { {1,2,3}, {4,5,6},/原创 2021-02-13 09:56:50 · 251 阅读 · 0 评论 -
为什么有些情况下scanf后面要跟一个getchar?
scanf是先往缓冲区中写入数据,然后在把数据从缓冲区中取出getchar作用是从缓冲区中获取一个字符putchar是向屏幕上输出一个字符#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void test(){ int num = 0; printf("请重新给num赋值:"); scanf("%d", &num); printf("num的新值为:%d\n",num); char ch = 'a'; printf(原创 2021-02-13 09:54:31 · 3795 阅读 · 2 评论 -
字符数组和字符串指针变量区别
字符串指针变量:无法修改所指向字符串内容字符数组:将常量区的字符串拷贝一份到栈区,可以对栈区字符串内容进行修改原创 2021-02-13 09:56:42 · 178 阅读 · 0 评论 -
数组做函数参数
数组名是数组元素首地址,可以直接当做实参,可以用指针或[]方式来当形参接收,都是地址传递,形参都是指针方式#include<stdio.h>void input(int arr[]){ arr[0] = 520; arr[1] = 521; //这里得出的大小是4个字节,证明形参是指针形式 printf("%d \n", sizeof(arr));}void output(int* arr){ for (int i = 0; i < 5; i++) { pri原创 2021-02-13 09:56:31 · 184 阅读 · 0 评论 -
c语言数组和指针相关知识点
要点1:int arr[5]={1,2,3,4,5};1.arr指向数组元素首地址,可以简单理解,当做指针使用2.[]本质就是 *()简写3.sizeof(arr)的大小是整个数组的大小,而指针无论类型大小都是4字节,这是区别#include<stdio.h>void test(){ int arr[5] = { 1,2,3,4,5}; printf("%d\n", arr[0]); printf("%d\n", *arr); printf("%p\n", arr);原创 2021-02-12 10:52:27 · 270 阅读 · 0 评论 -
不同类型指针区别
1.步长不同 +1后往后跳跃字节数量不同2.解引用的时候,取出来的字节数不同原创 2021-02-12 08:56:49 · 385 阅读 · 0 评论 -
空指针,野指针,万能指针
空指针int * p=NULL;空指针指向地址编号为0的地址,不可以访问空指针指向的内容,因为内存地址编号0~255之间被系统占用,不可以访问野指针int *p=0xffff;指针变量指向非法的内存空间,或指针变量为初始化也属于野指针万能指针void 无类型指针称为万能指针*万能体现在:void*可以保存任意数据类型指针的地址#include<stdio.h>void test(){ //万能指针 void* p = NULL; int num = 10; p原创 2021-02-12 08:56:32 · 329 阅读 · 0 评论 -
const修饰指针
const修饰指针简单区分:对于*号和p而言,const离谁更近就修饰谁1.常量指针-----const修饰*号*p只读p可读可写简而言之:指针指向的内容不能改变,指针指向可以发生改变2.指针常量------const修饰*p*p可读可写p只读简而言之:指针指向的内容可以改变,指针指向不能发生改变3.const既修饰号又修饰p7. *p只读8. p只读9. 简而言之:指针指向内容不可以改变,指针指向不能发生改变...原创 2021-02-12 08:56:24 · 127 阅读 · 0 评论 -
return和exit的区别
return退出当前函数exit(0)退出当前程序原创 2021-02-12 08:56:15 · 163 阅读 · 0 评论