来今天咱们今天先不讲题目和算法,我们先来讲一讲一个很重要的基础
第一个就是指针,这里就会有人会说了指针不就是字母前面加了个*号吗,有什么难的。嗯的确是在字母前加了个星号,但没弄懂确实特别难,但只要弄懂了就是炒鸡简单的东西了,而且还能拿来自己运用!
好了废话不多说,咱们开造。
使用的规则就是 * 指针变量名;(*取内容运算符自右向左)
当我们的指针碰上了数组,那真是个奇妙的组合。
有个潜规则:数组自带地址(这个要牢记!!!)
来看我们的一维数组与指针
先定义一个数组 int a[10]; //定义一个一维数组
int *p; //定义一个指向int型的指针变量p
p=&a[0]; //取数组元素a[0]的地址,p指向第一个元素(也可以这么表达p=a[])
p=a; //数组名代表数组首地,p指向第一个元素
一维数组就这么多,并不复杂
二维数组与指针
我们通过一个我上课老师分享的一个总表达
二维分为行和列所以就有行地址与列地址
行地址:(a是定义好的数组)
a+i 表示的意思是指向第i行
(*p1)[m]=a ;
p1+i; 表示指向第i行
列地址:下面表示的都是 i行j列
a[i][j] a[i]+j *(a+i)+j (*(a+i))[j]
{
*p2=a[0];
p2++; //明显的让数组指针“动起来”
p2+sizeof(int)*i+j; // 可以不用记住这个
}
上面就是基本上我们常用的数组的指针表达方式了。
第二个就是我们的动态存储分配
这个是用户在程序执行过程中,根据自己的需要来临时向系统申请分配存储单元空间。这种储存方式可以通过C语言的库函数来实现分别是:malloc,calloc,free,realloc.
这四个库函数是在头文件"stdlib.h"
1、malloc:
原型为 void*malloc(unsigned int size)
功能:在内存的动态储存区中分配一个长度(字节数)为size的连续空间。返回值是一个指针,指针类型是void*,指针值为已分配空间的起始地址。若动态存储中没有足够的空间单元分配,则返回NULL(空指针)
重点:在调用该函数时必须要用强制类型转换运算符将void*转换为所需要的类型(下面我来展示一下)
例子:
short *px;
float *pf;
px=(short *)malloc(2); //可以替换成px=(short *)malloc(short) 用户可以不用自己知道类型
pf=(float*)malloc(4); //可替换成pf=(float*)malloc(float) 的字节数
if(px!=NULL)
*px=3;
if(pf!=NULL)
*pf=4.5;
当指针变量当pf与px没有被赋值所以对应的指针变量是不能赋值的!!
2、calloc
原型:void *calloc( unsigned int n,unsigned int size)
功能:给n个同一类型的数据项(大小均为size)分配一块连续的存储空间(n*size),若分配成功,则函数返回该存贮空间的指针,指针类型为void*,指针值为该空间首地址;若分配失败,则返回NULL空指针。
重点:由calloc函数所分配得到的无名数组中的每一个元素,系统将自动赋初始值为0
同样要将其利用强制类型转换运算符将void*转换为所需要的类型。
3、free
原型:void free(void* ptr)
功能:指针变量ptr指向一个要释放内存的内存块,该内存块之前是通过调用malloc,calloc或realloc函数进行内存分配的。没有返回值。
只用执行
例如:free(pf)
凡是使用过malloc和calloc的一定要通过free释放空间要不然会造成内存泄漏,导致程序运行速度减慢甚至系统崩溃的后果。