二维数组和二维指针的关系

今天在看一个关于链表的题时,看到一个

                           void  RemoveNode(ListNode **pHead,int value)

                                   {

                                            if(pHead==NULL || *pHead==NULL) 

     就是看到这里让我开始思考什么是二级指针,我突然发现我脑海中只有(指向一个指针的指针)这一个概念,然后上网查,发现了更多的问题,开始思考二维数组和二级指针到底是神马关系。可能有人和我一样知道一维数组名被当成函数参数是会退还成一个一维指针,我们先看一个程序

#include <stdio.h>
#include <string.h>

void func(char **ptr)
{
    char arry[2][6] =
    {
        "ABC",
        "DEF",
    };
    ptr = arry;
}

int main(int argc, char *argv[])
{
    char **ptr = NULL;
    func(ptr);
    printf("%s\n", ptr);
    return 0;
}

GDB调试程序结果:


打印类型看了下,并不能发现我们想要的结果,这个程序编译时在ptr=arry这里是报了警告的

test.c:11:9: warning: assignment from incompatible pointer type [enabled by default]

这个警告的意思就是指针类型不匹配(有些编译器可能直接报错误)


接下来我们看正文

下面这个出处是《C专家编程》第10章

数组和指针参数是如何被编译器修改的?

数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

实参                                                     所匹配的形参

数组的数组             char c[8][10];                      char (*)[10];           数组指针

指针数组                 char *c[10];                          char **c;                指针的指针

数组指针(行指针)   char (*c)[10];                       char (*c)[10];         不改变

指针的指针             char **c;                               char **c;                不改变


恩,大家可能稍微懂了点,再来看一位网友的总结,老铁写得非常棒

int main(void) 
{ 
    int arr1[3]; 
    int arr2[3]; 
    int arr3[3]; 
    int * ptr; 
    // ptr1是一个指向 int [3] 的指针,即ptr1的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 
    int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}}; 
    // ptr2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,注意:ptr指向的内存区域不定长 
    int * ptr2[3]={arr1,arr2,arr3}; 
    // ptr3是一个指向 int [3] 的指针,即ptr3的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 
    int(* ptr3)[3]=&arr1; 
    ptr3=ptr1; // 没错,他们的类型相同 
 // ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3] 
 // ptr4是一个指向 int * 的指针,即ptr4的类型和&ptr是一样的,注意:ptr指向的内存区域不定长 
    int ** ptr4; 
    //ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int ** 
    ptr4=ptr2; // 没错,他们的类型相同 
 //ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int ** 

    return 0; 
}




恩,通过这里我对二维指针和二维数组的关系理解比以前更深了,mmp,才发现一个晚自习就过去了


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值