C语言提高复习01

花时间仔细复习一下:

基础:c语言语法基础+数据结构+系统编程

提升:接口封装与设计(模块划分、断层思维)+ 接口api使用能力、查找能力、实现能力

跳跃:win+linux项目

简单的排序功能:

#include "stdlib.h"
#include "string.h"
#include "stdio.h"

//排序
void main01()
{
	int		i = 0,j = 0;
	int		tmp = 0;
	int a[] = {33,654,4,455,6,33,4};

	printf("排序之前\n");
	for (i=0; i<7; i++)
	{
		printf("%d ", a[i]);
	}
	
	//排序

	//外层循环	当i=0的时候, 让j从1===N进行变化
	//外层循环	当i=1的时候, 让j从2===N进行变化
	//			当i=2的时候, 让j从3===N进行变化
	//结论: 按照一个变量i不变,让另外一个变量j进行变化;下一轮 依次进行

	for(i=0; i<7; i++)  
	{
		for (j=i+1; j<7; j++)  //内层循环: a[i] 和 a[j]比较
		{
			if (a[i] > a[j])
			{
				tmp = a[i];
				a[i]= a[j];
				a[j] = tmp;
			}
		}
	}

	printf("排序之后\n");

	for (i=0; i<7; i++)
	{
		printf("%d ", a[i]);
	}

	printf("hello...\n");
	system("pause");
}


//void printArray(int a[7], int num)
//void printArray(int a[], int num)
void printArray(int *a, int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		printf("%d ", a[i]);
	}
}

void sortArray(int a[7], int num)
//void sortArray(int a[], int num)
//void sortArray(int *a, int num)
{
	int i , j , tmp ;
	int		num2 = 0;

	num2 = sizeof(a)/sizeof(a[0]);
	printf("num:%d \n", num2);
	//实参的a 和 形参的a 的数据类型本质不一样
	//形参中的数组 ,编译器会把它当成指针处理 这是C语言的特色
	for(i=0; i<num; i++) 
	{
		for (j=i+1; j<num; j++)  //内层循环: a[i] 和 a[j]比较
		{
			if (a[i] > a[j])
			{
				tmp = a[i];
				a[i]= a[j];
				a[j] = tmp;
			}
		}
	}
}

//数组做函数参数的退回问题  退回为一个指针, 
//1 正确做法:把数组的内存首地址和数组的有效长度传给被调用函数
//2 //实参的a 和 形参的a 的数据类型本质不一样
	//形参中的数组 ,编译器会把它当成指针处理 这是C语言的特色
	//排序 本质也剖析 
//3 形参写在函数上,和写在函数内是一样的,只不过是具有对外的属性而已.
void main22()
{
	int		i = 0,j = 0;
	int		tmp = 0;
	int		num = 0;
	int a[] = {33,654,4,455,6,33,4,3333};
	num  = 7;

	num = sizeof(a)/sizeof(a[0]);
	printf("num:%d \n", num);

	printf("排序之前\n");
	printArray(a, num);

	//排序

	//外层循环	当i=0的时候, 让j从1===N进行变化
	//外层循环	当i=1的时候, 让j从2===N进行变化
	//			当i=2的时候, 让j从3===N进行变化
	//结论: 按照一个变量i不变,让另外一个变量j进行变化;下一轮 依次进行

	sortArray(a, num);

	printf("排序之后\n");
	printArray(a, num);

	printf("hello...\n");
	system("pause");
}

输出:

排序之前
33 654 4 455 6 33 4 排序之后
4 4 6 33 33 455 654 hello...

结论:1、数组做函数参数会退化为指针,实参的a为数组,传给形参的a是指针,数据类型本质不一样;形参中的数组 ,编译器会把它当成指针处理,这是C语言的特色,

2、且形参和函数内变量一样,临时栈上内存。形参写在函数上,和写在函数内是一样的,只不过是具有对外的属性而已.

数据类型本质:固定内存大小的别名;

数据类型的作用编译器预算对象(变量)分配的内存空间大小

  • 求数据类型的大小sizeof(int *)

int b[10];

b 代表的数组首元素的地址
&b代表的是整个数组的地址  

数据类型别名:

//复杂数据类型
typedef struct Teacher2
{
	char name[64];
	int age;
}Teacher2;
//数据别名 typedef

//简单数据类型
typedef int u32;

数据类型封装:

                 int InitHardEnv(void **handle);

  • 1、void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
  • 2、用法1:数据类型的封装
  •      典型的如内存操作函数memcpy和memset的函数原型分别为

                      void * memcpy(void *dest, const void *src, size_t len);

                      void * memset ( void * buffer, int c, size_t num ); 

  • 3、用法2:  void修饰函数返回值和参数,仅表示无。
  •        如果函数没有返回值,那么应该将其声明为void型

           如果函数没有参数,应该声明其参数为void

           int function(void)

           {return 1;}

  • 4、void指针的意义 
  •       C语言规定只有相同类型的指针才可以相互赋值

          void*指针作为左值用于“接收”任意类型的指针

          void*指针作为右值赋值给其它指针时需要强制类型转换

          int *p1 = NULL;

          char *p2 = (char *)malloc(sizoeof(char)*20);

  • 5、不存在void类型的变量
  •       C语言没有定义void究竟是多大内存的别名

  • 6、扩展阅读《void类型详解.doc》

数据类型总结与扩展

  • 1、数据类型本质是固定内存大小的别名;是个模具,c语言规定:通过数据类型定义变量。
  • 2、数据类型大小计算(sizeof)
  • 3、可以给已存在的数据类型起别名typedef
  • 4、数据类型封装概念(void 万能类型)

变量本质:

变量:能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。

变量本质:

1、程序通过变量来申请和命名内存空间 int a = 0

2、通过变量名访问内存空间

(一段连续)内存空间的别名(是一个门牌号)

3、修改变量有几种方法?

1、直接

2、间接。内存有地址编号,拿到地址编号也可以修改内存;于是横空出世了!(编程案例)

3、内存空间可以再取给别名吗?引用

//重要实验:
int  main333()
{
	//
	//2种方法,通过变量直接操作内存
	//	通过内存编号操作内存

	int i = 0;

	printf("&i:%d\n", &i);

	*((int *)(1245024)) = 10;
	printf("i:%d", i);
	printf("hello....\n");
	getchar();
	return 0;
}

变量总结:

1 对内存,可读可写;2通过变量往内存读写数据;3 不是向变量读写数据,而是向变量所代表的内存空间中写数据。问:变量跑哪去了?

思考1:变量三要素(名称、大小、作用域),变量的生命周期?

思考2:C++编译器是如何管理函数1,函数2变量之间的关系的?

内存四区建立流程:

流程说明

1、操作系统把物理硬盘代码load到内存

2、操作系统把c代码分成四个区

3、操作系统找到main函数入口执行

 字符串常量在全局区。

理解指针的关键在于内存

栈的生长方向与数组b[10]中b的生长方向,是不同的概念。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值