您的位置:首页 > 其它

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

2017-09-21 20:04 176 查看
今天在看一个关于链表的题时,看到一个

                           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,才发现一个晚自习就过去了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: