指针 指针数组 数组指针 二级指针 到底怎么指向?
创始人
2025-05-30 01:24:11

一、本文研究:

指针数组 与 二级指针
数组 与 数组指针

上面的两两一对,而并不是指针数组、数组指针这俩一对,弄清楚这一点,就懂了一半了。
一个是数组 ,一个是指针

二、指针数组 与 二级指针

指针数组:是一个存放指针的数组,数组的每个元素都是指针变量
看下面例子,看懂就会了

#include int main(){char *lines[5] = {"COSC1283/1284","Programming","Techniques","is","great fun"};char *str1 = lines[1];char *str2 = *(lines + 3);char c1 = *(*(lines + 4) + 6);char c2 = (*lines + 5)[5];char c3 = *lines[0] + 2;printf("str1 = %s\n", str1);printf("str2 = %s\n", str2);printf("  c1 = %c\n", c1);printf("  c2 = %c\n", c2);printf("  c3 = %c\n", c3);return 0;
}

在这里插入图片描述

对照上面哪里不会看哪里

#include int main(){char *string0 = "COSC1283/1284";char *string1 = "Programming";char *string2 = "Techniques";char *string3 = "is";char *string4 = "great fun";char *lines[5];lines[0] = string0;lines[1] = string1;lines[2] = string2;lines[3] = string3;lines[4] = string4;char *str1 = lines[1];char *str2 = *(lines + 3);char c1 = *(*(lines + 4) + 6);char c2 = (*lines + 5)[5];char c3 = *lines[0] + 2;printf("str1 = %s\n", str1);printf("str2 = %s\n", str2);printf("  c1 = %c\n", c1);printf("  c2 = %c\n", c2);printf("  c3 = %c\n", c3);return 0;
}

为了突出说明二级指针,再来:

#include int main(){char *lines[5] = {"COSC1283/1284","Programming","Techniques","is","great fun"};char **p = lines;	//p是二级指针//line给p赋值,说明line是二级指针char *str1 = p[2];	//这里修改成2了原理一样char *str2 = *(p + 3);char c1 = *(*(p + 4) + 6);char c2 = (*p + 5)[5];char c3 = *p[0] + 2;printf("str1 = %s\n", str1);printf("str2 = %s\n", str2);printf("  c1 = %c\n", c1);printf("  c2 = %c\n", c2);printf("  c3 = %c\n", c3);return 0;
}
  • char *lines[5]定义了一个指针数组,它的每个元素的类型都是char 。在表达式中使用 lines时,它会转换为一个类型为char**的指针,这样lines就表示一个指向字符的指针,而**lines表示一个具体的字符,这一点很重要,读者一定要明白。
  • lines 是二级指针,*(lines+i) 是一级指针,**(lines+i) 才是具体的字符。

在这里插入图片描述
深入理解,关于地址怎么指的,指哪去了。
注意,"line"使用的时候也被理解成指针,也就是我们定义的那个p
在这里插入图片描述

三、数组 和 数组指针

二维数组是怎么回事?
int a[3][4]各部分是怎么回事?

重点:"a"当作指针用
在这里插入图片描述
定义数组指针:
热知识:数组指针走一步是走一行,也就是从a[0] 走到 a[1]
注意:维度必须要有,也就是说,得让这个指针知道它一行能走多少。
举个例子:维度是4,也就是一步走4 == 一行走4个元素

int (*p)[4];

**

#include 
void func(int (*p)[4]) {printf("%d\n", p[1][2]);		//输出6
}
void func1(int (*p)[3]) {	//改变维度了,也就是,分组这样了//{{0,1,2},{3,4,5},{6,7,8},{9,10,11}}print("%d\n", p[1][2]);	//输出5
}
int main(){int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};int(*p)[4];int i,j;p=a;for(i=0; i<3; i++){for(j=0; j<4; j++) printf("%2d  ",*(*(p+i)+j));printf("\n");}func(a);func1(a);return 0;
}

四、总结

在这里插入图片描述

五、leetcode指针怎么用?

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
}
  • 参数里面的所有指针都不是二维数组,均是一维数组,这一点首先明白
  • nums:一维数组传进来用一个一级指针接受一下一维数组的首地址
  • numsSize:表示传进来的一维数组的长度,如果没有长度,只靠首地址,我们无法知道这个数组有多大
  • returnSize:这是调用函数的时候传进来的一个整数的地址,为什么传这个整数地址呢,因为我们需要在函数里改变它的值。所以用指针接收这个地址,指向这块内存。使用的时候,例如:*returnSize = 3;
  • returnColunmSizes:这是调用函数的时候传进来的一个一维数组的地址,一维数组本来就是一级指针,取地址加一级,所以用二级指针接受。为什么传这个一维数组的地址呢,因为我们需要在函数里改变它的值。所以用指针接收这个地址,指向这块内存。使用的时候,例如:(*returnColumnSizes)[*returnSize] = 3;
  • (*returnColumnSizes)表示对returnColumnSizes解引用,二级指针解引用,成一级指针,也就是指向了该数组。[*returnSize]再次解引用。
  • (*returnColumnSizes) 相当于 a
  • (*returnColumnSizes)[returnSize] 相当于 a[2] (假设returnSize = 2)
  • 看图:
  • 在这里插入图片描述

在这里插入图片描述

相关内容

热门资讯

HTML5新增 系列文章目录 前端系列文章——传送门 HTML系列文章——传送门 文章目录系列文章目录什么是 HT...
Spring事务管理,xml和... 目标:熟悉事务管理的核心接口,能够说出它的3个核心接口及内容 sprin...
潮汐车道可以掉头吗(潮汐车道可... 今天给各位分享潮汐车道可以掉头吗的知识,其中也会对潮汐车道可以拐弯吗进行解释,如果能碰巧解决你现在面...
叶克膜是什么(叶克膜是什么药物... 本篇文章极速百科给大家谈谈叶克膜是什么,以及叶克膜是什么药物对应的知识点,希望对各位有所帮助,不要忘...
二手雪佛兰迈锐宝2013款价格... 本篇文章极速百科给大家谈谈二手雪佛兰迈锐宝2013款价格多少,以及二手雪佛兰迈锐宝2013款价格多少...
爬山是什么意思网络用语(网络语... 本篇文章极速百科给大家谈谈爬山是什么意思网络用语,以及网络语言爬山是什么意思?对应的知识点,希望对各...
企业网盘的优势到底在哪里? 归根结底,企业网盘作为一个功能型产品,比之普通的个人网盘其优势到底在哪里...
一万的电动四轮车(一万的电动四... 今天给各位分享一万的电动四轮车的知识,其中也会对一万的电动四轮车电油两用进行解释,如果能碰巧解决你现...
阳历是什么(阳历是什么历是公历... 本篇文章极速百科给大家谈谈阳历是什么,以及阳历是什么历是公历还是农历对应的知识点,希望对各位有所帮助...
艾瑞泽5e怎么样-车主点评-真... 本篇文章极速百科给大家谈谈艾瑞泽5e怎么样-车主点评-真实评价-口碑,以及艾瑞泽5e2017款对应的...
庚寅年是哪一年(清朝庚寅年是哪... 本篇文章极速百科给大家谈谈庚寅年是哪一年,以及清朝庚寅年是哪一年对应的知识点,希望对各位有所帮助,不...
Django从0到视图开发实战 Djanogo框架特点 Django 是一个全栈web框架功能完善,要素齐全完善的文档...
依赖注入~ 依赖注入之setter注入: 依赖注入是IOC具体的一种实现方式, 这是...
2012款菲亚特菲跃怎么样(2... 今天给各位分享2012款菲亚特菲跃怎么样的知识,其中也会对2013款菲亚特菲跃进行解释,如果能碰巧解...
雪弗兰赛欧油耗怎么样,新赛欧的... 今天给各位分享雪弗兰赛欧油耗怎么样,新赛欧的真实油耗多少的知识,其中也会对雪佛兰赛欧真实油耗多少进行...
有哪些水生动物(有哪些水生动物... 本篇文章极速百科给大家谈谈有哪些水生动物,以及有哪些水生动物有特别之处对应的知识点,希望对各位有所帮...
立冬的寓意是什么(立冬有什么寓... 本篇文章极速百科给大家谈谈立冬的寓意是什么,以及立冬有什么寓意对应的知识点,希望对各位有所帮助,不要...
14 elf 文件执行的流程 前言 这里我们来探讨一下 elf 文件的执行流程  当然 这也是我很久以前 就想了解的东西了  不过...
假如用CSS来逆向推理视觉设计... 最近几个月都在忙乎自己的产品,活生生体验了一把需求-设计-前端开发集成式累成狗的节奏&...
如何计算运行时间(即计算时间复... 一般法则 for循环 一次for循环的运行时间至多是该for循环内语句(包括测试&#x...
信宜说什么话(广东信宜说什么方... 本篇文章极速百科给大家谈谈信宜说什么话,以及广东信宜说什么方言对应的知识点,希望对各位有所帮助,不要...
煮熟的螃蟹怎么保存(煮熟的螃蟹... 今天给各位分享煮熟的螃蟹怎么保存的知识,其中也会对煮熟的螃蟹怎么保存合适进行解释,如果能碰巧解决你现...
东西南北无弯路是什么字(东西北... 本篇文章极速百科给大家谈谈东西南北无弯路是什么字,以及东西北无路打一地名对应的知识点,希望对各位有所...
俄罗斯火箭(俄罗斯火箭炮射程)... 本篇文章极速百科给大家谈谈俄罗斯火箭,以及俄罗斯火箭炮射程对应的知识点,希望对各位有所帮助,不要忘了...
“国产版ChatGPT”文心一... 文章目录前言实验结果一、文学创作问题1 :《三体》的作者是哪里人?问题2:...
OWIN+ASP.NET We... 1、创建一个WebAPI项目,在Visual Studio 中选择这个 2、生成的目...
layui框架学习(15:表单...   上一篇文件介绍了Layui中表单的大致结构,本文开始学习表单中与几种输入元素相关的...
sonywh-1000xm3(... 本篇文章极速百科给大家谈谈sonywh-1000xm3,以及sonywh1000xm3蓝牙耳机怎么配...
务实派后来者居上昂科威和柯迪亚... 本篇文章极速百科给大家谈谈务实派后来者居上昂科威和柯迪亚克哪个好,以及昂科威与柯迪亚克谁好柯迪亚克图...
september怎么读(20... 今天给各位分享september怎么读的知识,其中也会对20thseptember怎么读进行解释,如...