【c】多级指针
一.一级指针
1.int *p,*p2;
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。p是变量名,*表明是指针,指针指向地址。
在定义时初始化,如int *p_2 = &b; //定义一个指针,指针指向一个地址
先定义再初始化,如int *p1; p1 = &a;//定义了一个指针,用这个变量名去赋值
*p1是p1所指向的变量的值
为a赋值
#include <stdio.h> int m = 3; void usepo(int *a){ *a=2;//输出a=2 *a =m;//输出a=3 a=&m;//输出a=0 ? } int main(){ int a; usepo(&a); printf("%d",a); }
用指针交换两个数的值
void swap(int *xx,int *yy){ int *temp; temp=xx; xx=yy; yy=temp; }/*主函数中用swap(&x,&y)调用*/
失败,因为虽然参数是指针,但是作为参数的指针是临时复制的,在函数里互换操作的是临时指针而不是指针指向的内容
只是在子函数里创建了两个数的副本,仍没有改变源数。
void swap(int xx,int yy){
int temp;
temp=xx;
xx=yy;
yy=temp;
}/*主函数中用swap(x,y)调用*/
和这种调用本质一样
成功改变数的值
void swap(int *xx,int *yy) { int temp; temp=*xx; *xx=*yy; *yy=temp; }
2.与数组相关
#include <stdio.h> void usepo(int *a){ for(int i=0;i<10;i++){ a[i]=i; //或*(a+i)=i; } } int main(){ int a[10]; //a=&a[0](数组首地址),&a=int (*)[10](数组地址) usepo(a); for(int i=0;i<10;i++) printf("%d ",a[i]); } //正常输出0 1 2 3 4 5 6 7 8 9
一个错误的示范
用指针创建动态数组,需要分配空间。 一维数组 int *p; p = (int*)malloc(m*(sizeof(int)));//动态申请内存
二维数组
int **p;
p = (int**)malloc(m*(sizeof(int*)));//二级指针所在地址申请内存
int i, j; for (i = 0; i<m; i++)
p[i] = (int*)malloc(sizeof(int)*n);//一级指针所在地址申请内存
用三级指针传递二维数组指针地址创建二维动态数组(迷宫问题) int **maze=NULL; initMAZE(&maze); void initMAZE(int ***maze){ srand(time(NULL)); int i,j; int x,y;//读入x,y int **typeM; scanf("%d %d",&x,&y); //为二级模板数组申请空间 typeM = (int **)malloc(sizeof(int*)*(x+2)); for (int r=0;r<=x+1;r++) typeM[r]=(int *)malloc(sizeof(int)*(y+2)); //迷宫赋值 for (i = 0; i<=x; i++) { for (j = 0;j<=y;j++){ typeM[i][j]=(int)rand()%2; } } for (i = 0; i <=x; i++){ typeM[i][0]=1; typeM[i][x]=1; } for (j = 0;j<=y;j++){ typeM[0][j]=1; typeM[x][j]=1; } //保证入口出口是可走的 typeM[1][1]=0; typeM[x-1][x-1]=0; *maze = typeM; }

更多精彩