学习c语言至今,已经到了一个瓶颈,难度大多来自于指针和指针的参数传递。
指针分为一维指针、多维指针、函数指针、指针数组、数组指针等等;其中主要我们要了解的是一维指针和指针数组、数组指针。
#include<stdio.h> #include<stdlib.h> void allocate_memory_for_two_array(int *pload[],int line,int row) void initial_memory_for_two_array(int *pload[],int line,int row) void sort_pop_for_two_array(int *pload[],int line,int row) void output_two_array(int *pload[],int line,int row) void get_line_and_row_for_two_array(int *pline,int *prow) int main(void) { int line,row; int **pload=NULL;//定义了一个二维指针,并且将其置为空,分配给它一块栈空间的内存; get_line_and_row_for_two_array(&line,&row);//调用获取行和列的函数,并且给其传递两个变量的地址 pload=(int**)malloc(line*sizeof(int *));//动态分配给二维指针一块堆空间大小为line*sizeof(int*)的内存空间, allocate_memory_for_two_array((pload),line,row);调用动态分配内存的函数,将二维指针类型的pload传递给*pload[]指针数组,在这里,形参如果是指针数组类型,必须给他传递二维指针类型的实参 initial_memory_for_two_array(pload,line,row);// sort_pop_for_two_array(pload, line, row); output_two_array(pload,line,row); free(*pload);//释放小内存 free(pload);//释放大内存,此内存由段空间分配,用完结束后必须立即释放 return 1; }
一维指针,实际上就是一个地址,众所周知一个数组的首地址就是一个一维指针,形式为int(char) *,
例如:int *load;load也可以作为load[]数组的首地址,两者在参数传递是是等价的;
多维指针;本质上也是由一维指针演变来的;
例如:int buff[][],作为二维数组,其首地址可以写做 buff,这是一个行指针,代表第0行的地址,当然也是一个一维指针,同样的,如果要将第一行的第一个元素的地址表达出来,buff[0],而如果要求整个二维数组的地址应该用&buff表示,对其求值,也就是*buff,代表着第一行第一个元素的地址,如果再次求值**buff,得出的结果是第一行第一个元素地址存放的值
二维数组:
int load[5][10];
int *pload=&load[0][0];pload类型是int*,load[i]本质上是二维数组第i+1行的
多维指针;
int num=10;
int *pload=#
int **ppload=&pload;
int ***pppload=&ppload;