3 二维指针
3.1 什么是二维指针?
二维指针与一维指针一样都是保存变量的地址。
- 实例:一维指针存放变量地址,二维指针存放一维指针地址。
#include <stdio.h>
int main(){
int n = 10;
printf("&n = %p\n",&n);
int* p = &n;
int** pp = &p;
printf("%p\t%p\n",p,*pp);
printf("%d\t%d\t%d\n",n,*p,**pp);
}
&n = 0x7ffdd4366894
0x7ffdd4366894 0x7ffdd4366894
10 10 10
实例:一维指针存放数组地址,二维指针存放指针数组地址。
#include <stdio.h>
int main(){
//指针与数组之间的关系
int arr[6] = {1,2,3,4,5,6};
int* p = arr;
for(int i = 0;i < 6;++i){
printf("%d ",p[i]);
}
printf("\n");
//二维指针与指针数组之间的关系
int arr2[6] = {7,8,9,10,11,12};
int* pp[] = {arr,arr2};
int** parr = pp;
for(int i = 0;i < 2;++i){
for(int j = 0; j < 6;++j){
printf("%d ",parr[i][j]);
}
printf("\n");
}
}
3.2 二维指针怎么用?
3.2.1 二维指针作为函数参数
实例1:传入一维地址可以取出函数内部申请的动态内存,取出单个变量
#include <stdio.h>
#include <stdlib.h>
void Func(int** pp){
int* p = malloc(sizeof(int));
*p = 100;
*pp = p;
printf("%p\t%d\n",*pp,**pp);
}
int main(){
int* p = NULL;
Func(&p);
printf("%p\t%d\n",p,*p);
free(p);
p = NULL;
}
实例2:传入一维地址可以取出函数内部申请的动态内存,取出一个数组
#include <stdio.h>
#include <stdlib.h>
void Func(int** pp){
int* p = malloc(sizeof(int)*10);
*pp = p;
for(int i = 0;i < 10;++i){
p[i] = i;
}
printf("%p\t%d\n",*pp,**pp);
}
int main(){
int* p = NULL;
Func(&p);
printf("%p\t%d\n",p,*p);
for(int i = 0;i < 10;++i){
printf("%d ",p[i]);
}
printf("\n");
free(p);
p = NULL;
}
实例3:传入指针数组地址
#include <stdio.h>
void PrintStr(char** s,int n){
for(int i = 0;i < 2;++i){
printf("%s\n",s[i]);
}
}
int main(){
char* s[] = {
"Hello",
"World"
};
PrintStr(s,2);
}
3.2.2 二维指针作为函数返回值
- 实例:创建一个
r*c
的单位矩阵
#include <stdio.h>
#include <stdlib.h>
int** CreatePointer(int r,int c){
int** p = (int**)malloc(sizeof(int*)*r);
for(int i = 0;i < r;++i){
p[i] = (int*)malloc(sizeof(int)*c);
for(int j = 0;j < c;++j){
p[i][j] = (i == j);
}
}
return p;
}
int main(){
int r,c;
scanf("%d%d",&r,&c);
int** pp = CreatePointer(r,c);
for(int i = 0;i < r;++i){
for(int j = 0;j < c;++j){
printf("%d ",pp[i][j]);
}
printf("\n");
}
for(int i = 0;i < r;++i){
free(pp[i]);
pp[i] = NULL;
}
free(pp);
pp = NULL;
}
- 实例:实现函数输入正数n,返回三角星号图像字符串数组。例如:n=4
#include <stdio.h>
#include <stdlib.h>
int main(){
int n;
scanf("%d",&n);
char** pp = (char**)malloc(sizeof(char*)*n);
for(int i = 0;i < n;++i){
pp[i] = calloc(i+2,sizeof(char));
for(int j = 0;j <= i;++j){
pp[i][j] = '*';
}
}
for(int i = 0;i < n;++i){
printf("%s\n",pp[i]);
}
for(int i = 0;i < n;++i){
free(pp[i]);
pp[i] = NULL;
}
free(pp);
pp = NULL;
}