二维数组与二维指针
二维数组在C语言中是以一维的方式线性存储的
二维数组中的第一维是一维数组,第二维才是真是值。
二维数组名也可以看成常量指针。
例如:char c[3][3];c[0]为一个数组,c[0][0]才是真实值。
#include<stdio.h>
Print_arr(int a[],int num) {
int i;
for(i=0;i<num;i++){
printf("%d\n",a[i]);
}
}
int main(){
int* p=NULL;
int cc[3][3]={{1,2,3},{4,5,6}};
p=&cc[0][0];
Print_arr(p,9);
return 0;
}
能打印出1.2.3.4.5.6.0.0.0说明二维数组是线性存储的
二维指针
#include<stdio.h>
int main(){
int a=1;
int* p=&a;
int** pp=&p;
printf("%d,%d\n",*p,**pp);
return 0;
}
输出1,1
指针的本质也是变量,那么是变量就有传值调用和传址调用的区别,当传址调用时也就是要传入指针的地址——二维指针出现!
二维指针的用途之动态数组重分配
#include<stdio.h>
#include<malloc.h>
int reset(char** pp,int size,int new_size){
int ret=1;
int i=0;
int len = 0;
char* pt =NULL;
char* tmp = NULL;
char* p = *pp;
if((pp!=NULL)&&(new_size > 0)){
pt = (char*)malloc(new_size);
tmp = pt;
len= (size < new_size) ? size:new_size;
for(i=0;i<len;i++){
*tmp ++=*p++;
}
free(*pp);
*pp = pt;
}
else{
ret =0;
}
return ret;
}
int main(){
char* p=(char*)malloc(5);
printf("%p\n",p);
if(reset(&p,5,3)){
printf("%p\n",p);
}
return 0;
}
二维数组和数组指针
#include<stdio.h>
int main(){
int a[5][5];
int (* p)[4];
p=a;
printf("%d\n",&p[4][2]-&a[4][2]);
return 0;
}
有警告,类型不匹配,导致输出为-4
C语言中只有一维数组,所有多维数组都可以看成一维数组,只不过一维数组内的类型变为数组了,二维数组的函数名是数组指针类型的,这种指针类型由其指向的数组大小和类型共同决定。如:int (p*)[5]
#include<stdio.h>
int main(int argc,char* argv[],char* env){
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d\t",*(*(a+i)+j));
}
}
}