C进阶3:二维指针
Posted yantuguiguziPGJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C进阶3:二维指针相关的知识,希望对你有一定的参考价值。
1. 什么是二维指针
二维指针与一维指针一样都是保存地址的变量。
- 示例1
#include <stdio.h>
int main()
int n=0,m=0;
printf("&n=%p\\n",&n);
printf("&m=%p\\n",&m);
int* p = NULL;
int** pp = &p;
scanf("%p",pp);
scanf("%d",p);
printf("n=%d\\nm=%d\\n",n,m);
一维指针存放变量地址,二维指针存放一维指针地址。
- 示例2
#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\\n",p[i]);
// 二维指针与指针数组之间关系
int arr2[6] =7,8,9,10,11,12;
int* parr[] = arr,arr2;
int** pp = parr;
for(int i=0;i<2;++i)
for(int j=0;j<6;++j)
printf("%d ",pp[i][j]);
printf("\\n");
一维指针存放数组地址,二维指针存放指针数组地址。
2. 二维指针怎么用
1. 二维指针作为函数参数
- 传入一维指针地址
传入一维指针地址可以取出函数内部申请的动态内存。
可以取出单个变量
#include <stdio.h>
#include <stdlib.h>
void Func(int** pp)
int* p = malloc(sizeof(int));
*p = 100;
*pp = p;
printf("&p=%p\\tp=%p\\t*p=%d\\n",&p,p,*p);
int main()
int* p = NULL;
Func(&p);
printf("&p=%p\\tp=%p\\t*p=%d\\n",&p,p,*p);
free(p);
p = NULL;
也可以取出一个数组
#include <stdio.h>
#include <stdlib.h>
void PrintArray(int* arr,int n)
for(int i=0;i<n;++i)
printf("%p %d\\n",arr+i,arr[i]);
void Func(int** pp,int n)
int* p = malloc(sizeof(int)*n);
for(int i=0;i<n;++i)
p[i] = i;
PrintArray(p,n);
*pp = p;
int main()
int* p = NULL;
int n=6;
Func(&p,n);
PrintArray(p,n);
free(p);
p = NULL;
- 传入指针数组地址
#include <stdio.h>
void PrintStrings(const char** strs,int n)
for(int i=0;i<n;++i)
printf("%s\\n",strs[i]);
int main()
const char* strs[] =
"abcd",
"1234",
"甲乙丙丁"
;
PrintStrings(strs,3);
2. 二维指针作为函数返回值
动态内存创建二维数组。
int arr[n][m]
等同于n
个int[m]
数组。int[m]
使用malloc()
表示是malloc(m*sizeof(int))
。这需要一个指针数组int*[n]
存放申请的首地址。int*[n]
使用malloc()
表示是malloc(n*sizeof(int*))
。
二维指针通常用作指针数组的返回值类型。
示例:创建m*n的单位矩阵
#include <stdio.h>
#include <stdlib.h>
int** CreateIdentityMatrix(int r,int c)
int** pm = (int**)malloc(sizeof(int*)*r);
for(int i=0;i<r;++i)
pm[i] = (int*)malloc(sizeof(int)*c);
for(int j=0;j<c;++j)
pm[i][j] = (i==j);
return pm;
void PrintMatrix(int** pm,int r,int c)
for(int i=0;i<r;++i)
for(int j=0;j<c;++j)
printf("%d ",pm[i][j]);
printf("\\n");
void DestoryMatrix(int** pm,int r,int c)
for(int i=0;i<r;++i)
free(pm[i]);
free(pm);
pm = NULL;
int main()
int r,c;
scanf("%d%d",&r,&c);
int** pm = CreateIdentityMatrix(r,c);
PrintMatrix(pm,r,c);
DestoryMatrix(pm,r,c);
3. 练习
- 实现函数
swapString()
,交换两个字符串的值。 - 实现函数
swapArray()
,交换两个数组的值。 - 实现函数输入正数n,返回三角星号图像字符串数组。例如:n=4
*
**
***
****
- 实现函数输入正数n和m,返回n~m行随机行随机列的星号图像字符串数组。例如:n=4,m=9
****
******
**********
****
********
******
作者:jdzhangxin
链接:https://www.jianshu.com/p/a25773a884ba
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于C进阶3:二维指针的主要内容,如果未能解决你的问题,请参考以下文章