美文网首页
C进阶3:二维指针

C进阶3:二维指针

作者: jdzhangxin | 来源:发表于2020-01-12 09:05 被阅读0次

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
****
******
**********
****
********
******

相关文章

  • C进阶3:二维指针

    1. 什么是二维指针 二维指针与一维指针一样都是保存地址的变量。 示例1 一维指针存放变量地址,二维指针存放一维指...

  • 深入理解C指针

    标签(空格分隔): C语言进阶 本文将会持续更新。。。。 指向指针的指针 在c语言中指针的操作时通过指针变量来实现...

  • 12 C指针

    1、指针定义 2、指针进阶 3、指针使用 4、多级指针 4、指针和数组 5、指针和字符串 6、高级指针之和指向函数的指针

  • 1216笔记

    1216 C基础review: 二维数组 指针:一定要知道指针的指向,即指针指向哪里 指针的运算:注意移动字节数...

  • C/C++中二维数组、行指针/数组指针、指针数组、二级指针的区分

    看看他们的定义: 二维数组: int matrix[3][4]; 行指针/数组指针: int (*m)[4]; 指...

  • 9月23日

    今天老师讲了很多。 1.指针数组 int *p[10] 存放10个指针的数组; 2.二维数组指针 int a[3]...

  • 7.C语言-指针

    1. 二维数组 2.字符指针变量和字符数组 3. 有关指针的数据类型的小结 4. void指针

  • c语言进阶 c和指针(三)

    这一篇主要写语句和操作符及表达式 一、if语句 if和while语句即使只有一句话最好也写上大括号,有格式感,这是...

  • c语言进阶 c和指针(五)

    这里讲一讲函数的可变参数列表和字符串和字符以及结构体联合体和动态内存分配 一、可变参数列表 C 语言允许定义参数数...

  • c语言进阶 c和指针(六)

    这一篇主要讲各种输入输出函数 一、流的概念 需要说明的是,现在基本上不建议用gets()了,c11中已经彻底取消了...

网友评论

      本文标题:C进阶3:二维指针

      本文链接:https://www.haomeiwen.com/subject/azkyactx.html