一、数据类型
《1》数据类型的本质:
数据类型可理解为创建变量的模具,是固定大小的内存的别名;
《2》作用:
编译器预算变量分配内存的大小
如:
char,一个字节大小的内存,
int,四个字节大小的内存,
long,四个字节大小的内存,(32位编译器)等
《3》数据类型可定义别名
使用 typrdef 定义别名;
如:
typedef int INT;
INT age;
//相当于int age;
二 、变量
《1》变量的本质:
变量是内存空间的别名,是一个标号;
《2》分类:
全局变量,局部变量
《3》修改变量的方法:
(1)直接修改
(2)间接修改
《4》void 无类型
void * 无类型指针,可只想任意类型的数据
(1)用于数据类型的封装
(2)修饰函数返回值的首地址或参数,表示无返回值
(3)void * 指针的意义:
把一个不知道类型的首地址给传出来
例如:
void* getchar_1()
{
void *p=(void *)malloc(100);
return p;
}
三、内存四区
《1》内存四区:
堆区、栈区、全局区(常量区)、代码区
《2》规则
(1)规则一、main()函数分配的内存在堆区、栈区、全局区都可以在被调函数中使用;
(2)规则二、在被调函数中分配的内存,属于局部变量,在函数结束时,变量销毁,主调函数不可使用;如以下场景是错误的:
char* getstring1()
{
char buf[30];
strcpy(buf,"abcdefg");
return buf;//buf[30]为局部变量,函数结束时,变量被销毁;
}
(3)主函数能调用很多函数,但是,依然只有一个堆区一个栈区、
四、C语言关键字:
详情见博客:
http://blog.youkuaiyun.com/dai_wen/article/details/78277156
五、语句
1、三种循环:
〈1〉for循环
(一般采用左闭右开区间,切忌在循环体内改变变量)
for循环是有效的循环之一;for(起始条件;判断条件;循环条件)
如:
int i,num=20;
for(i=0;i<num;i++)
{
//循环体
}
〈2〉while循环
while(判断条件)
{
//循环体
}
〈3〉do…while()循环
do{
//循环体
}while(判断条件)
2、判断语句( if 和0比较)
〈1〉判断真假
if(flag)
{
//
}
〈2〉整数和0比较
if(age==0)
{
}
<3>指针变量和0比较
int *p=NULL;
if(p!=NULL)
{
*p=NULL
}
<4>浮点型和0比较
//给一个精度范围:
#define exp 0.00000001
#include<stdio.h>
int main()
{
double d=0.1;
if( (d> -exp ) && (d < exp ) )
{
//处理语句
}
return 0;
}
3、选择语句switch( )
〈1〉语法结构
switch( 选择条件 )
{
case 常量表达式1: /* 语句;*/ break;
case 常量表达式2:/* 语句;*/ break;
//...
case 常量表达式n:/* 语句;*/ break;
}
4、break 和continue的区别
break放在循环内部:用于直接结束循环,
continue放在循环内部:用于结束本次循环,继续执行下一次循环
典型例子:(while实现字符首尾缩进)
http://blog.youkuaiyun.com/dai_wen/article/details/75637204
5、折半查找法
对有序序列使用折半查找法查找元素,如下图所示:
(1)折半查找法查找数字
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int binary_search(int arr[],int key, int sz )
{
int left=0;
int right=sz-1;
while(left<=right)
{
int mid=(left+right)/2;
if( key == arr[mid] )
return mid;
else{
if(key>mid)
left = mid+1;
else
right = mid-1;
}
}
return -1;
}
int main()
{
int array[]={1,2,3,4,5,6,7,8,9};
int key=7;
int sz = sizeof(array)/sizeof(array[0]);
int ret =binary_search(array,key,sz);
if( ret == -1 )
{
printf("找不到\n");
}
else printf("找到了ret: \n",ret);
return 0;
}
(1)折半查找具体:
http://blog.youkuaiyun.com/dai_wen/article/details/75637166
(2)利用折半查找实现猜数字游戏:
http://blog.youkuaiyun.com/dai_wen/article/details/75639675
六、数组
数组从内存角度来说,是一片连续大小的内存块,存储相同大小的数据元素;
详情见:
http://blog.youkuaiyun.com/dai_wen/article/details/79215601
七、指针
没有内存哪来指针啊
(1)指针是用来指向一段内存块,
(2)指针指向谁,就把谁的地址赋给指针
(3)指针三大铁律:
《a》指针铁律一:指针也是一种变量,具有内存空间,用来保存地址
《b》指针铁律二:通过(*p)和(*p++)来改变变量的值是指针存在的最大意义
《c》指针铁律三:理解指针,必须和内存四区相结合
(4)特别注意野指针问题(对已经释放的空间再次使用,造成对同一块内存空间多次释放)
八、数组指针:
《1》数组指针详情
http://blog.youkuaiyun.com/dai_wen/article/details/79204255
《2》数组指针和指针数组的区别
//数组指针和指针数组形式很像,但是很容易区分
//主要是看操作符的优先级,()[]的操作符优先级一样,结合方向从左至右
char *array[30];//先看[30],是数组,在看char* ,存放指针,所以是个存放指针的数组,指针数组
char (*array)[30];//先看(*array),是个指针,再看[30],所以是个 数组指针
九、字符串
1、模拟实现strcpy
http://blog.youkuaiyun.com/dai_wen/article/details/79141922
2、 strlen,strcpy,strcat,strcmp,strstr,memcpy,的模拟实现方式
http://blog.youkuaiyun.com/dai_wen/article/details/77966014
3、 如何将字符串反转
http://blog.youkuaiyun.com/dai_wen/article/details/79184884
4、 如何删除字符串中的空格
http://blog.youkuaiyun.com/dai_wen/article/details/79175900
5、 求子字符串在另一字符串中出现的次数
http://blog.youkuaiyun.com/dai_wen/article/details/79142733
6、 将字符串奇偶位的字符分离保存
http://blog.youkuaiyun.com/dai_wen/article/details/79187784
十、手动分配内存空间(malloc、colloc、 realloc)
详情见:
http://blog.youkuaiyun.com/dai_wen/article/details/78407709
1、malloc
《1》malloc()和free()必须配对使用
int *p=(int *)malloc(40);
if( p == NULL )
{
printf("out of memory");
exit(EXIT_FAILURE);
}
for(i=0;i<10;i++)
{
*(p+i)=10-i;
}
free( p );
p = NULL;
2、colloc
int * ptr=(int *)calloc(10,sizeof( int ));//将数组元素初始化为0
if( ptr == NULL )
{
printf("out of memory");
exit(EXIT_FAILURE);
}
free( ptr );
ptr=NULL;
return 0;
3、realloc
重新开辟空间,主动释放空间,无须手动释放
http://blog.youkuaiyun.com/dai_wen/article/details/77880167
十一、排序法
1、冒泡排序法
相邻元素向比较,大的往下沉,小的往上浮;
所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法。具体方法是,相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则排序完成。
2、选择排序法
用一个元素和其它所有元素进行依次比较;
简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
3、快速排序法
在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
十二、结构体
http://blog.youkuaiyun.com/dai_wen/article/details/79381296
本文不全,有待改进>_<