今天主要对于昨天学习的指针进行了加强与巩固学习了一些指针的新用处
一,const的用法
1.const是什么
const是C语言中的一个关键字,是定义只读变量的关键字。但是一个变量经过const的修饰后,不仅拥有常量的属性,又有变量的属性,所以又说const是定义常变量的关键字。
2.const修饰普通变量
用const修饰普通变量实际上就是定义了一个常量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。 一般对于const变量名都是全大写的。如果我们强行修改const定义的常量,就会报错。
实际上,虽然不能直接对常变量进行修改,但是我们可以通过指针对常变量进行修改:
所以当指针指向const常变量时,为避免通过指针修改const常变量,我们应当相应地用const指针指向const常变量。
3、const修饰指针
(1)const修饰p:
int i = 10;
int * const p = &i;
p++;//p指针指向下一个元素,错误
const修饰指针p表示指针不可修改,即一旦得到了某个变量的地址,不能再指向其它变量:
虽然指针不可修改,但是可以修改指针所指向的变量的值:
-
int i = 10;
-
int * const p = &i;
-
*p = 26;//没问题
(2)const修饰*p
int i = 10;
const int * p = &i;
const修饰*p表示不可通过指针修改其所指变量的值:
int i = 10;
const int* p = &i;
*p = 26;//通过指针修改其所指变量的值,错误(常指针)
二,万能指针
1.void* 指针的使用
由于 void 类型是一个特殊的类型,常被称作“空类型”,C语言中没有 void 类型的变量,所以在遇到 void 指针时,编译器根本不知道如何解释接下来的内存,甚至编译器都不知道接下来多少内存属于它。故而,在C语言中,遇到 void * 指针时,如果需要访问它指向的内存,需要重新指定类型(也就是指针类型的强制转换),否则就会报错。
void choiceSort
{
char *p = NULL;
p = (char*)p ;
printf("%c\n",p);
}
2.void指针不能进行指针运算
void *p *p = 100 X error
int *q; q = (int *)p;
三,堆区
一、堆区空间的理解:
前面测试,普通的数组变量默认最大不能申请1M的空间(栈区),甚至远少于1M的空间,毕竟程序中的其他变量也需要使用空间。总共就1M,要省着用。
想要使用更大的,没有限制的空间,C语言给我们提供了方式:
如下:
malloc // 申请空间,理论上物理内存有多大,就能申请多大,当然并不能,电脑系统运行其他软件按也需要空间。
free // 释放空间,申请的空间必须我们自己释放。
1.这两者都是申请40个空间
2.realloc扩容
这个函数的代码格式可以理解为 ,你之前malloc或者calloc申请的空间是p指针进行接收的,OK此时你想对这个空间进行空间的扩展,那此时的ptr也就是p指针变量,size也就是你需要的实际空间,这里的空间不是扩展的空间,而是实际的空间
void *realloc(void *ptr, size_t size);
也就是realloc(p,40)
chat *p = malloc ( 1024 * 1024 * 8) 前者在栈区,后者在堆区
四,练习
1.指针的逆序
被调函数1
交换函数
被调函数2:逆序
被调函数3:打印
主函数
2.指针的选择排序
被调函数1,交换
被调函数2.指针的选择排序
被调函数3.打印函数
主函数
3.快速排序 qSort
被调函数1.交换
被调函数2.快速排序
被调函数3.打印函数
主函数
4.指针的二分法(用快排方式查找)
被调函数1.2.3.同上
被调函数4
主函数
4.Strlen函数用指针表示
主函数
5.strcpy 与 strncpy函数
6.strcat 与strncat函数
7.strcmp 与 strncmp函数
主函数
8.扩容与堆区的借用和归还
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
今天的学习就到这了,明天见。