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
****
******
**********
****
********
******
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容