二维指针与一维指针
- 一维指针int *p
- 二维指针int **q
一维指针和二维指针的区别不大,都是用来间接寻址,只不过一维只能间接寻址一次,二维能够间接寻址两次。
int address=0x1000;
int *p=address;
int **q=address;
//p,q都是指向address的指针,p,q的值都是&address
printf("%p,%p,%p",p,q,&address);
//*p,*q都是&address这个内存空间对应的值,都等于address
printf("%d,%d,%d",*p,*q,address);
//**q是以address为地址的内存空间对应的值
二维指针一般可以用来指向一维指针,从而能够在函数中修改一维指针的指向
int main(){
int a=5;
int *p;
p=&a;
printf("%p",p);//p之前的指向
changePointer(&p);
printf("%p",p);//p之后的指向
}
void changePointer(int **q){
printf("%d",**q);//打印5
printf("%p",*q);//打印a的地址
printf("%p",q);//打印p的地址
*q=0x1000;//将p指向0x100
}
二维指针与二维数组
建议用一维指针指向二维数组,二维指针不能直接指向二维数组。因为二维数组的内存空间是连续的,二维指针只不过是一个单纯的能够间接寻址的指针,对内存空间无要求。想要用二维指针表示二维数组,必须要使用malloc进行动态内存分配。
代码来源:https://blog.csdn.net/xiyu_tian/article/details/116716187
#include<stdio.h>
#include<stdlib.h>
int fun(int** arr)
{
int sum=0,i;
for(i=0;i<=4;i++)
{
sum+=arr[i][i];sum+=arr[4-i][i];
}return sum;
}
int main()
{
int i,sum=0;
int** arr=(int**)malloc(5*sizeof(int*));
for(i=0;i<=4;i++)
{
arr[i]=(int*)malloc(5*sizeof(int));
}
for(i=0;i<=4;i++)
{
scanf("%d %d %d %d %d",&arr[i][0],&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4]);
}
printf("sum=%d\n",fun(arr));
for(i=0;i<=4;i++)
{
free(arr[i]);
}free(arr);
}
传产过程中不要使用二维指针做形参表示二维数组