C语言提高
文章平均质量分 57
BUS375
不积跬步无以至千里,不积小流无以成江海!
展开
-
不带头结点的单链表的删除
问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。p->data = p->next->data;p->next = p->next->next;firee(p->next); 链表结点定义如下: struct ListNode{ int m_nKey;转载 2016-11-01 21:22:16 · 5282 阅读 · 0 评论 -
c语言“多态”和c++中的多态
C++通过抽象类,也就是面向抽象类编程实现的(相当于C++编译器通过多态机制,已经很好用了。提前布局vptr指针、虚函数表;调用是迟绑定完成。)C++多态实现的三个条件:1.要有继承2.要有虚函数重写3.要有父类指针(引用)指向子类对象C语言中如何实现多态效果的呢?c语言中的函数指针 实现的回调函数 间接赋值是指针存在的最大意义。间接赋值成立的三个条件:原创 2016-09-26 15:53:31 · 375 阅读 · 0 评论 -
回调函数
当函数指针(函数名)做为函数的参数,传递给一个被调用函数,被调用函数就可以通过这个指针调用外部的函数,这就形成了回调。回调函数:利用函数指针做函数参数,实现的一种调用机制,具体任务的实现者,可以不知道什么时候被调用。#define _CRT_SECURE_NO_WARNINGS#include #include#include //子任务的实现者int add(int a,in原创 2016-09-25 20:18:50 · 290 阅读 · 0 评论 -
函数指针语法梳理
//函数指针基本语法梳理//1.如何定义一个函数类型//2.如何定义一个函数指针类型//3.如何定义一个函数指针(指向一个函数的入口地址)int add(int a, int b){ int c = a+b ; return c;}int main(){ //直接调用函数 函数名就是函数入口地址 add(1,2); //间接调用 定义一个函数类型 {原创 2016-09-25 18:04:27 · 439 阅读 · 0 评论 -
数组类型基本语法梳理
#define _CRT_SECURE_NO_WARNINGS#include #include#include //数组类型基本语法梳理 //1.定义一个数组类型//2.定义一个数组指针类型//3.定义一个 数组指针变量int main(){ int a[10];//a代表数组首元素的地址 &a代表整个数组的地址 a+1 和&a+1步长 { //1.定义一原创 2016-09-25 17:52:12 · 271 阅读 · 0 评论 -
程序在内存中的存储
程序的内存分配 在计算机系统中,运行的应用程序的数据都是保存在内存中,不同类型的数据,保存的内存区域不同,包括: 1、栈区[stack]:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区[heap]:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。转载 2016-10-11 08:30:42 · 1156 阅读 · 0 评论 -
malloc的内存分配之 malloc(0)的内存分配情况
#includeusing namespace std;int main(){ char *p; if((p=(char *)malloc(0))==NULL) puts("got a null pointer"); else puts("got a valid pointer"转载 2016-10-11 07:56:10 · 528 阅读 · 0 评论 -
c语言中的const总结
#include#include#include #include void getMem(const char *p){ //p =1;//编译通过 //p[1] = 0;//报错 左值指定const对象 指针所指向的内存空间不能被修改}void getMem2( char const *p){ //p =1;//编译通过原创 2016-09-14 10:34:18 · 469 阅读 · 0 评论 -
指针铁律4/5:应用指针必须和函数调用相结合(指针做函数参数)
指针铁律4:应用指针必须和函数调用相结合(指针做函数参数)指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。 1)如果基础类int变量,不需要用指针; 2)若内存块是1维、2维。铁律5:一级指针典型用法(指针做函数参数) 1)一级指针做输入: int showbuf(char *p) int showArray(int转载 2016-09-13 09:57:40 · 335 阅读 · 0 评论 -
原码、反码、补码,计算机中负数的表示
原文转载:http://blog.chinaunix.net/uid-26495963-id-3074603.html原码:将一个整数,转换成二进制,就是其原码。 如单字节的5的原码为:0000 0101;-5的原码为1000 0101。反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。 如单字节转载 2016-10-22 07:17:50 · 350 阅读 · 0 评论 -
*b++==*(b++)
#define _CRT_SECURE_NO_WARNINGS#include #include#include void swap(char a,char b){ char tmp = a; a = b; b = tmp;}int main(){ char *a ; char *b; a = malloc(8); strcpy(a,"GOBLIN");原创 2016-10-21 21:46:39 · 2333 阅读 · 0 评论 -
定义数组指针的三种方法
1)通过数据类型定义数组指针: typedef int(ArrayType)[5]; int *a ArrayType* pointer; 2) 声明一个数组指针类型 typedef int (*MyPointer)[5]; MyPointer myPoint; 3)直接定义:int (*pointer)[n]; pointer 为数组指针变量名 t转载 2016-09-16 16:20:57 · 10817 阅读 · 0 评论 -
字符数组和字符指针的区别
在C语言中使用字符数组来模拟字符串C语言中的字符串是以’\0’结束的字符数组C语言中的字符串可以分配于栈空间,堆空间或者只读存储区#define _CRT_SECURE_NO_WARNINGS#include #include#include int main(){ char buf[20]= "aaaa"; char buf2[] = "bbbb"; char *p原创 2016-10-19 08:16:42 · 290 阅读 · 0 评论 -
两个辅助指针变量挖字符串(4种实现方式)
两个辅助指针挖字符串1) 使用第二种内存模型 主调函数分配内存 #include #include #include #include /*函数功能 根据字符c来分割字符串str*/ int splitStr(const char *str,char c ,char buf[10][20],int *num)原创 2016-10-06 11:07:11 · 875 阅读 · 0 评论 -
字符串练习(1.统计字符串中字串的数量2.字符串逆序3.字符串替换)
#define _CRT_SECURE_NO_WARNINGS#include #include#include /************************************************************************//* 函数:功能 统计str中sub出现的次数 *//原创 2016-10-06 10:55:14 · 311 阅读 · 0 评论 -
二叉树的中序非递归遍历c语言版
由于c语言没有c++的STL库,我们无法借助c++的stack库实现二叉树的非递归遍历,但是,我们完全可以自己打造一个c语言版的stack库。本篇博文就是借助我们之前在栈的链式存储这篇博文实现的程序。当然,你也可以把它编译成动态库dll(可以参考)放到自己的工程项目中。#define _CRT_SECURE_NO_WARNINGS#include #include#inclu原创 2016-10-06 07:56:54 · 6951 阅读 · 1 评论 -
如何封装自己的动态库应用案例
一、生成dll文件1.创建一个dll应用程序生成dll2.添加mysocketclient.c文件3.生成mysocketclient.dll4.会在相应目录下生成mysocketclient.dll和mysocketclient.lib文件二、创建测试程序加载dll文件1.创建win32空项目并添加这两个文件2.原创 2016-09-26 11:09:27 · 3494 阅读 · 0 评论 -
void*指针的用法
指针有两个属性:指向变量/对象的地址和长度但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,比如: int*从指定地址向后寻找4字节作为变量的存储单元 double*从指定地址向后寻找8字节作为变量的存储单元 1.void指针是一种特别的指针 void *vp //说它特别是因原创 2016-10-02 15:16:51 · 3666 阅读 · 1 评论 -
动态申请二维数组的原理
原创 2016-10-14 10:39:32 · 459 阅读 · 0 评论 -
strlen和sizeof
#include#include#include //一级指针的典型用法//数组int a[10]//字符串//c语言的字符串是以0 结尾的字符串//c语言中没有字符串类型 通过字符数组来模拟字符串//字符串的内存分配 堆 栈 全局区 int main13(){ //指定长度 //不指定长度 C编译器会自动帮助程序员求元素的个数 char buf1[]={'a','b'原创 2016-09-13 14:16:09 · 277 阅读 · 0 评论 -
Linux内核链表VS传统链表
Linux内核中的链表是一个C实现的链表的典型传统的链表都是数据和指针装在一个节点里:struct node{ type data; struct node *prev,*next;};而内核链表把指针独立出来,做成节点,在被含有数据的entry包含:struct list_head{ struct list_head *prev,*nex转载 2016-09-20 15:22:14 · 1052 阅读 · 0 评论 -
单向链表的基本操作
#include#include#include #include typedef struct Student{ char name[64];//64 int id;//4 char *p;//4 char**p2;//4 //struct Student s;//编译不通过 }Student;typedef struct Teacher00{ char name原创 2016-09-20 14:46:32 · 243 阅读 · 0 评论 -
二级指针输出模型
#include#include#include #include //指针做输出:被调用函数分配内存//指针做输入:主调函数分配内存//求文件中两段话的长度int getMem(char**myp1,int *mylen1,char**myp2,int *mylen2){ char *temp1 = NULL; char *temp2 = NULL; temp1 = (c原创 2016-09-15 07:20:26 · 916 阅读 · 0 评论 -
strstr的使用案例
#include#include#include #include /*去除字符串inStr中的空格*/int trimSpace(char*inStr,char*out){ char *p = inStr; int ret = 0; int i; if (p==NULL) { ret = -1; return; } for (i=0;p[i]!='\0';i++原创 2016-09-14 09:59:02 · 1026 阅读 · 0 评论 -
字符串反转技术推演过程
#include#include#include #include char g_buf[100];//字符串反转int reverseStr(char*str){ char* start = str; int len = strlen(str); int ret = 0; char* end = start+len-1; char temp; if (start==N原创 2016-09-14 08:46:20 · 280 阅读 · 0 评论 -
字符串copy函数的技术推演过程
#include#include#include void copy_str(char* from ,char* to){ for (;*from!='\0';from++,to++) { *to = *from; } *to = '\0'; return ;}void copy_str2(char* from ,char* to){ for (;*from!='\原创 2016-09-13 15:36:22 · 309 阅读 · 0 评论 -
多级指针
某知名IT公司笔试题#include#include#include int main(){ char *c[]={"HELLO","NEW","WORLD","SAYHZ"}; char **cp[]={c+3,c+2,c+1,c}; char ***cpp = cp; printf("%s\n",**++cpp); printf("%s\n",*--*++cpp+原创 2016-09-13 14:29:55 · 270 阅读 · 0 评论 -
指针铁律2/3:间接赋值是指针存在的最大意义
1)两码事:指针变量和它指向的内存块变量 2)条件反射:指针指向某个变量,就是把某个变量地址否给指针 3)*p间接赋值成立条件:3个条件 a) 2个变量(通常一个实参,一个形参) b) 建立关系,实参取地址赋给形参指针 c) *p形参去间接修改实参的值4)引申: 函数调用时,用n级指针(形参)改变n-1级指针(转载 2016-09-13 08:55:01 · 1080 阅读 · 0 评论 -
指针铁律1:指针也是一种数据类型
#define _CRT_SECURE_NO_WARNINGS#include#include#includechar* getStr11(){ char *temp = NULL; temp = "abcdef";//这个指针temp等价于常量指针 字符串存储在常量区 函数结束时还存在 return temp;}char* getStr12(){ char str[]转载 2016-09-11 11:11:17 · 1567 阅读 · 0 评论 -
内存四区
内存四区建立的流程1、操作系统把物理硬盘代码load到内存 2、操作系统把c代码分成四个区3、操作系统找到main函数入口执行 详细说明:原创 2016-09-12 10:52:33 · 387 阅读 · 0 评论 -
二级指针的3种内存模型
二级指针做输入第一种内存模型#include#include#include #include int sort_arr(char**myArr,int num){ char*temp; char **p = myArr; int i,j; for (i=0;i<num;i++) { for (j=i+1;j<num;j++) { if (strcmp(p原创 2016-09-14 15:32:01 · 1164 阅读 · 0 评论 -
多维数组名的本质
#define _CRT_SECURRE_NO_WARNINGS#include#include#include void main(){ int a[3][5],i=0,j=0; int tmp =1; for (i=0;i<3;i++) { for (j=0;j<5;j++) { a[i][j] = tmp++; } } for (i=0;i<3;i转载 2016-09-16 17:15:43 · 640 阅读 · 0 评论 -
定义结构体类型和初始结构体的3种方法
#define _CRT_SECURRE_NO_WARNINGS#include#include#include ////定义结构体类型的方法3种/*1) 定义类型 用类型定义变量2)定义类型的同时定义变量3)直接定义结构体变量*///定义了一个数据类型 固定大小内存块的别名 还没有分配内存typedef struct Teacher{ char name[20];原创 2016-09-17 11:06:23 · 1895 阅读 · 0 评论 -
配置文件读写案例
一. 配置文件读写案例实现分析1、 功能划分a) 界面测试(功能集成)自己动手规划接口模型。b) 配置文件读写1)配置文件读(根据key,读取valude)2)配置文件写(输入key、valude)3)配置文件修改(输入key、valude)4)优化 ===》接口要求紧 模块要求松二.代码实现cfg_op.h#ifndef __CFG_OP_H#原创 2016-09-19 14:06:22 · 632 阅读 · 0 评论 -
结构体中的深浅拷贝
#define _CRT_SECURRE_NO_WARNINGS#include#include#include typedef struct Teacher { char name[20]; char *pname; int age;}Teacher;void copyStruct2(Teacher *to,Teacher* from){// *to = *from原创 2016-09-18 17:37:28 · 621 阅读 · 0 评论 -
二级指针三种内存模型强化训练
#define _CRT_SECURRE_NO_WARNINGS#include#include#include /*功能:把myp1,myp2指向的数据拷贝到myp3,并且排序*/int sort(char**myp1,int num1,char(*myp2)[30],int num2,char***myp3,int *num3){ char** p3 =NULL; int i原创 2016-09-18 14:59:25 · 468 阅读 · 0 评论 -
野指针问题
1.一级指针的野指针问题struct student{ char * name; int score;}stu, *pstu;int main(void){ strcpy(stu.name, "Jimy"); stu.score = 99; return 0;}这是很多人都容易犯的错误:定义了结构体变量stu,但结构体内部的char转载 2016-09-18 10:09:01 · 299 阅读 · 0 评论 -
证明多维数组的线性存储
#include//证明一下多维数组的线性存储 //线性打印void printfArray411(int *array, int num){ int i = 0; for (i=0; i<num ; i++) { printf("%d ", array[i]); }}void main(){ int a[3][5]; int i , j = 0; int转载 2016-09-18 09:38:15 · 254 阅读 · 0 评论 -
结构体包含二级指针和二级指针内存的申请与释放问题
#define _CRT_SECURRE_NO_WARNINGS#include#include#include typedef struct Teacher { char name[20];//20 内存块 已分配 int age;//4 char *alisname;//4 只分配4个字节的内存 char **stunames;//规定一个研究生导师带4名学生 }Te原创 2016-09-18 08:29:10 · 1332 阅读 · 0 评论 -
结构体包含一级指针
#define _CRT_SECURRE_NO_WARNINGS#include#include#include typedef struct Teacher { char name[20];//20 内存块 已分配 char *alisname;//4 只分配4个字节的内存 int age;//4 int id;//4}Teacher;void printTeache原创 2016-09-17 16:46:22 · 273 阅读 · 0 评论