
C 黑马 C提高
weixin_39538253
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
03 02scanf:%*d%s;空格 \n \t;[ab]、[ ^ab]、[a-z]、[ ^a-z]
ssanf(source,"字符匹配",target)sscanf,匹配从第一个字符开始%*d%s 非数字,字符。 情况: 1、乱码,数据类型不是%s; 2、空白,没有间隔符(空格、\t、\n等) %[abc] [abc]%[^abc] [非abc]%[a-z] a到z%[^a-z] 非[a到z]01 %*d%s#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h&g原创 2020-08-19 23:29:26 · 307 阅读 · 0 评论 -
03 01 calloc(初默认始0) realloc(可能迁移)
03 01 calloc和realloccalloc,默认初始化为0realloc,原地方不能扩建的话,直接拷贝迁移01 calloc 默认初始化为0#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>//1、calloc,不用初始化,一个指针直接引用void test1(){ int* p=calloc(10,sizeof(i原创 2020-08-03 23:38:31 · 396 阅读 · 0 评论 -
02 13 sprintf 格式化、拼接字符串、数字转字符串、二级指针与指针数组 格式化8、16进制
02 13 sprintfsprintf,输出到空间01 sprintf 格式化字符串#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>//1、格式化字符串void test1(){ char buff[100] = { 0 }; //printf( "%s", "参军徐赤特"); sprintf(buff, "%s", "原创 2020-08-03 17:16:17 · 573 阅读 · 0 评论 -
02 12 字符串反转;汉字硬反转(天连草色一川平 -> 平川一色草连天)
02 12 字符串反转单个if{return},不要if...else,挂掉就尽快退出01 汉字硬反转(天连草色一川平 -> 平川一色草连天)一些注释都是相想过来的思路,就不删除了。#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stddef.h>char* myReverseStrin原创 2020-08-03 00:18:10 · 278 阅读 · 0 评论 -
02 11 字符串拷贝(赋值、指针、指针极简洁写法)
02 11 字符串拷贝有数量,部分初始化 默认0有数量,没初始化 n个烫烫烫没数量,部分初始化 ?个烫烫烫没数量,没初始化 不允许使用01 字符数组(长度一定,正常;不定,乱码)#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stddef.h>//1、字符数组void原创 2020-08-02 21:38:53 · 347 阅读 · 1 评论 -
02 09 指针做函数参数的输入特性;02 10 指针做函数参数的输出特性
02 09 指针做函数参数的输入特性A调B,A主调函数,B被调函数输入特性:A开辟堆栈,B读写堆栈输出特性:B开辟堆栈,A读写堆栈01 输入特性:读堆区字符串#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stddef.h>//1、char* strvoid printString1(cons原创 2020-08-02 18:22:00 · 198 阅读 · 0 评论 -
02 08 指针的间接赋值
02 08 指针的间接赋值指针类型默认决定取地址的区块,但是不想默认,地址前加(数据类型*)n级指针,存的是(n-1)级指针的地址,可以间接修改(n-1)级指针的值实际3级指针到顶参数是指针的函数,一般是修改/使用外部变量(的地址?没听清)的值01 一级指针——传参(有点指进来又指出去的意思)#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.原创 2020-08-02 16:44:19 · 173 阅读 · 0 评论 -
02 06 指针基本概念(理论) 02 07 指针的步长(代码)
02 06 指针基本概念指针,能解引用,被给了一个地址,能代表它原创 2020-08-02 16:00:30 · 232 阅读 · 0 评论 -
02 05 栈的生长方向和内存存放方向(小端模式)
02 05 栈的生长方向和内存存放方向小端模式:高位字节放在高地址,低位字节放在低地址01 栈从高到低安排地址#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>void test1(){ int a = 1; int b = 1; int c = 1; printf("%p\n%p\n%p\n", &a, &原创 2020-07-29 23:09:16 · 171 阅读 · 0 评论 -
02 04 变量传递分析
02 04 变量传递分析00 以下的调用都是指调用栈区变量、堆区、全局的值01 main开栈:A调用main,B调用main#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>void A(){ B();}void B(){}void main() { int a = 1; A(); system("pause")原创 2020-07-29 22:11:34 · 144 阅读 · 0 评论 -
02 03 函数的调用惯例(参数压栈顺序,参数由谁销毁)
02 03 函数的调用惯例栈的地址是靠偏移量来寻找的,所以参数压栈顺序,函数参数的销毁是被调函数还是主函数执行(栈的维护方式)需要约定一致,这就是调用惯例明面上写函数test(),编译器可能实际上加了修饰字,来区分不同的调用惯例。C语言中有不同的调用惯例,比如int myadd(int a,int b)实际上编译器写成int _cdecl myadd(int a,int b),如下图,该关键字VS是有的,但不是标准的,linux下gcc的是_attribute_((cdecl))我不敲了,敲这个这个原创 2020-07-29 21:43:53 · 179 阅读 · 0 评论 -
02 02 函数调用流程(宏函数、函数栈的堆栈帧调用过程)
02 02 函数调用流程宏函数不是函数,比如:#define MAX 1,但是用起来象函数,如01。特点:不大,一定场景下效率比函数(比如例子02,很多对栈的处理)高真正的函数要有返回值、参数类型、函数体宏函数不做语法简单,就是替换,是简单的文本处理,一般不认为是C语言的内容栈,先进后出,First In Last Out,一种容器位置高的,地址高,所以认为是开口向下的。如下图栈的单位名称是堆栈帧、活动记录函数参数传递用到栈,所以没有栈就没有函数。比如:函数返回值地址(值大放栈,值小放寄存器,原创 2020-07-29 21:11:53 · 273 阅读 · 0 评论 -
11 15 字符串常量区(有张四区的图)
11 15 字符串常量区字符串常量可以直接取地址,&“hello world”,即值 == 名称"hello world"被自动认为是char*类型字符串常量,编译器不同,有时写入访问权限错误,即一般不可修改修改一下又重新分配一块内存,浪费空间,所以有的编译器优化允许修改,节省空间ASCII C规定,修改字符串常量,结果是未定义的两个指针指向同一块字符串常量,由于上面说的字符串内存优化,所以有的编译器下指针地址相同(VS),有的不同(tc2.0)。QT是同文件相同,不同文件不同。01原创 2020-07-29 18:43:56 · 260 阅读 · 0 评论 -
11 14 const全局和局部变量的区别
11 14 const全局和局部变量的区别const全局变量,常量区,一旦初始化不可直接或间接修改const局部变量,栈区,可间接修改,不可直接修改,可以间接修改01 const全局变量,不可直接或间接修改#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>//一旦初始化,不能直接或间接修改const int a = 1;void原创 2020-07-29 18:09:29 · 894 阅读 · 0 评论 -
01 13 extern和static区别
01 13 extern和static区别头文件不要放编译定义,只放声明01 全局静态变量、局部静态变量的区别//全局静态变量、局部静态变量,都存储在静态区,程序运行期间都合法有效,但作用域不同#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>int a = 10;//全局区,==extern int a=10,外部链接,其它文件原创 2020-07-29 14:45:54 · 139 阅读 · 0 评论 -
01 12 堆区
01 12 堆区0 c、C++在malloc的区别C自由,可以int* p = malloc(sizeof(int) * 5);C++严谨,只能int* p = (int*)malloc(sizeof(int) * 5);if (NULL == p),NULL写前面,= =写成 = 一下子能发现只要是连续的空间都可以使用下标的方式访问内存int* p = (int*)malloc(sizeof(int) * 5);p[0]=100;for循环的前加加与后加加++i和i++在这里没有区别,因原创 2020-07-29 00:12:03 · 124 阅读 · 0 评论 -
01 11 栈区
01 11 栈区01 不要返回局部变量的地址死掉的a跟你没关系了,不应用它;结果对,也不应用它。#include <stdlib.h>#include <stdio.h>//1int* getInt(){ int a = 1; return &a;}void test1(){ int* p = getInt(); printf("%d\n", *p);}void main() { test1(); system("pause");}原创 2020-07-27 20:56:44 · 110 阅读 · 0 评论 -
01 09、10 内存分区的概念(未完成)
01 09 内存分区的概念内存分区,为了理解人为总结的概念,根上是没有的1、数据区2、代码区共享,多开exe,代码区共享,数据区不同只读,防改初始化和未初始化的全局变量和静态变量1、栈区先进后出,小,系统管生死2、堆区大,程序员管生死,不注意释放就爆了在BSS区和栈区之间3、全局静态区3-1、全局区3-2、静态区内部联结3-3、常量区:字符串常量、const修饰的全局变量;只读,一旦初始化,不能修改char* p=“twinkle”;//实际能改,约定不能改const c原创 2020-07-27 20:45:12 · 113 阅读 · 0 评论 -
01 08 变量的间接赋值
01 08 变量的间接赋值不要使用不属于你的内存,有被系统回收的危险01 铺垫:直接赋值与间接赋值#include <stdlib.h>#include <stdio.h>//1void test1(){ //1 int a = 1; //直接赋值 a = 2; //间接赋值 int* pa = &a; *pa = 3; printf("%d\n", a);}void main() { test1(); system("pause"原创 2020-07-27 19:23:37 · 124 阅读 · 0 评论 -
01 07 sizeof用法
01 07 sizeof用法01 #pragma pack(1,2,…)#include <stdlib.h>#include <stdio.h>#pragma pack(1)//对齐模式改为1/*1 52 63 84 85 86 8*/struct persons{ char name; int age;}psn;void main() { printf("%d\n",sizeof(psn)); system("pause");}原创 2020-07-27 15:01:16 · 117 阅读 · 0 评论 -
01 06 void用法
01 06 void用法01 void 变量error;嵌套结构体死锁void a;//error,定义变量需要告诉编译器内存大小,而void是没有大小的#include <stdlib.h>#include <stdio.h>struct persons{ char name[21]; int age; struct persons psn;};void testA1(){ void a;//error struct persons psn;}v原创 2020-07-27 13:58:12 · 158 阅读 · 0 评论 -
01 05 typedef用法
01 05 typedef用法01 typedef与结构体//1、写法1struct Person1{ char name[64]; int age;};typedef struct Person1 myPerson1;//2、写法2typedef struct Person2{ char name[64]; int age;}myPerson2;//***************************************************************原创 2020-07-27 11:48:52 · 84 阅读 · 0 评论