0、指针
1、指针类型: 基本类型
2、空指针类型变量:没有意义,只是一个指针空间,用于记录地址(不能运算)
void* 变量;
注:由于空间指针void*不知道尺寸(类型),是不能进行+ -运算的
3、空地址:每个数据空间都有地址(地址>0),设置地址为0的指针为空指针(不指向任何的元素)
注:指针变量必须初始化
typedef NULL (void*)0;
(笔试和面试)
1、作用域:能被引用的区间
1、局部变量:在函数内定义(在函数)
2、全局变量:在函数外定义(文件内)
注:引用变量,一定注意作用域
2、生命周期:分配空间到释放
1、动态变量:auto
2、静态变量:
3、堆区 (程序员空间):空间由用户申请,由用户来释放空间。
API: 申请 malloc(size_t bytes) 释放:free
注:bytes代表字节的数量
注:malloc/realloc返回值为NULL,申请失败
注:头文件为 stdlib.h
3.1使用步骤:
1、申请 p=malloc(size_t)
2、使用
3、释放 free(p);
3.1.1变量空间
3.1.2数组空间:
概念:是一块同类型且连续的存储空间
1、内存复制:
memcpy(des,src,size); string.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Array
{
int* data; //指向存放数据的数组
unsigned short len; //最大长度
short index; //索引
};
int main()
{
int opt=0;
struct Array a={NULL,0,-1};
while(1)
{
printf("\n------------------菜单---------------------\n");
printf("please input (0:exit/1:intput/2:find/3:list)");
scanf("%d",&opt);
switch(opt)
{
case 0:
{
printf("exit\n");
if(a.len>0)
{
free(a.data);
a.data=NULL;
a.len=0;
a.index=-1;
}
return 0;
}
case 1:
{
int score;
char c='y';
do
{
printf("输入成绩");
scanf("%d",&score);
//判断是否未满
if(a.index+1==a.len)//满就加5个空间
{
int* temp=(int*)malloc(sizeof(int)*(a.len+5));
if(NULL!=temp)
{
memcpy(temp,a.data,sizeof(int)*a.len);
a.len+=5;
free(a.data);
a.data=temp;
}
else
printf("error\n");
}
//写入数据
a.data[++a.index]=score;
printf("if continue input?(y/n)");
scanf(" %c",&c);//前面' '消除'\n'影响
}while('y'==c);
break;
}
case 2:
{
printf("查找\n");
int key,mid;
int l=0,r=a.index;
printf("please intput the key word:");
scanf("%d",&key);
while(l<=r)
{
mid=(l+r)/2;
if(key>a.data[mid])
r=mid-1;
else if(key<a.data[mid])
l=mid+1;
else
{
printf("存在\n");
break;
}
}
break;
}
case 3:
{
printf("遍历\n");
int j=0;
while(j<=a.index)
{
printf("%d ",a.data[j]);
j++;
}
printf("\n");
break;
}
default:
printf("输入有误\n");
}
}
}