二维数组和二维指针的关系
2017-09-21 20:04
176 查看
今天在看一个关于链表的题时,看到一个
void RemoveNode(ListNode **pHead,int value)
{
if(pHead==NULL || *pHead==NULL)
就是看到这里让我开始思考什么是二级指针,我突然发现我脑海中只有(指向一个指针的指针)这一个概念,然后上网查,发现了更多的问题,开始思考二维数组和二级指针到底是神马关系。可能有人和我一样知道一维数组名被当成函数参数是会退还成一个一维指针,我们先看一个程序
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; 不改变
恩,大家可能稍微懂了点,再来看一位网友的总结,老铁写得非常棒
恩,通过这里我对二维指针和二维数组的关系理解比以前更深了,mmp,才发现一个晚自习就过去了
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,才发现一个晚自习就过去了
相关文章推荐
- 二维指针和二维数组的关系
- 二维数组和二维指针的关系
- C_C++_二维数组与二维指针的地址与访问关系
- C/C++中二维数组和指针关系分析
- c/c++中指针与二维数组的关系demo程序
- 34-二维数组与二维指针
- 4.6,数组参数与指针参数 二维数组参数与二维指针参数 一级指针参数
- C/C++中二维数组和指针关系分析
- 二维数组和二维指针在CUDA中的应用
- 关于二维数组与二维指针传递参数
- 二维数组与指针的关系
- 关于二维数组和二维指针的相关问题
- 指针和二维数组的关系
- C语言【指针】二维数组和字符串与指针的关系
- 二维数组和指针的关系
- C语言学习历程(十一)二维数组与指针的关系
- C++二维数组和指针的关系
- 二维数组和二维指针
- 剖析C/C++二维数组与指针的关系
- 探究二维数组与指针的关系