动态数组

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");
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值