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. 二维指针作为函数参数

  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;

  1. 传入指针数组地址
#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]等同于nint[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. 练习

  1. 实现函数swapString(),交换两个字符串的值。
  2. 实现函数swapArray(),交换两个数组的值。
  3. 实现函数输入正数n,返回三角星号图像字符串数组。例如:n=4
*
**
***
****
  1. 实现函数输入正数n和m,返回n~m行随机行随机列的星号图像字符串数组。例如:n=4,m=9
****
******
**********
****
********
******


作者:jdzhangxin
链接:https://www.jianshu.com/p/a25773a884ba
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于C进阶3:二维指针的主要内容,如果未能解决你的问题,请参考以下文章

C进阶3:二维指针

C语言进阶4——指针的进阶

C语言进阶指针的进阶

梦开始的地方 —— C语言指针进阶

C语言指针就应该这么学 - 指针的进阶篇

C----指针进阶