指针数组,二级指针,指向含有N个元素的一维数组的指针,指针的函数调用。_数组指针 指向一维数组-程序员宅基地

技术标签: c++  c语言  

目录

前言:

1.指针数组

2.二级指针

3.指向含有N个元素的一维数组的指针

4.指针的函数调用问题


前言:

指针的应用有很多,使用方法也有很多,形式同样也有很多,下面我们来了解一下这三种形式的指针。

1.指针数组

指针数组顾名思义就是一个数组里面存放的全部都是指针。这就是指针数组。

形式为: *p[N];

 int i,*x[2],a[2][3]={1,2,3,4,5,6};
 for(i=0;i<2;i++)
 x[i]=a[i];//让指针数组中的元素,也就是指针,来指向二维数组
 printf("%d",x[0][1]);
 printf("%d",*(x[0]+1));

输出的都为2;

2.二级指针

首先先了解一下二级指针的定义,二级指针其实就是指向指针的指针。因为我们知道,指针也是变量,所以它也会占用内存单元。所以指针也会有地址,那么就好说了,因为指针就是指向地址的,所以,只要一个变量,或是常量,只要有地址,那么就可以被指针所指向。所以就有了指向指针的指针,也就是二级指针;

 int i,*x,**s,a[3]={1,2,3};
 x=a;//一级指针指向数组a
 s=&x;//二级指针指向一级指针x
 printf("%d",**s);
 printf("%d",*(*s+1));

输出结果为1  2

具体的应用我们下面讲到指针的函数调用时一块讲解;

3.指向含有N个元素的一维数组的指针

这个可能用的不太多,所以听起来比较陌生,但他的用法其实也比较简单;

形式为:  (*p)[N],这种形式的指针,就是指向含有N个元素的一维数组的指针;

指向的是一维数组

int i,*q,(*p)[3],a[3]={11,12,32};
q=a;//直接指向a即可
p=&a;// p指向一维数组a的地址,这里要区分开;普通指针指向一维数组的区别
 printf("%d\n",**p);//取第一次地址是数组a,取第二次地址,才是a中的元素。
printf("%d\n",*(*p+1));

因为(*p)[N]的意思是指向含有N个元素的一维数组的指针,它和普通的指针;指向数组的方式不同

在指向一维数组时,由于a是数组名,代表就是数组首元素的地址。它不是变量,也不占用内存,但是在使用此指针进行指向时,需要对该数组名加取地址符。

这里其实可以抽象的理解一下,当在使用这种类型的指针时,此时一维数组的数组名就成了代表存放这一堆数(把数组中所有的元素看成一个整体);的一个变量名;

int (*p)[5];
int a[5]={1,2,3,4,5};//将其中的这几个元素都看成一个整体x。
int a=x; //此时a就相当于是一个变量名。a的地址就是首个数组元素的地址。

        这时p就可以当作一个普通的指针来使用了。不过要注意的是,不但该指针的类型要和数组一致之外,而且所对应的元素个数也应该保持一致。但取值时,需要经过两次取值符,第一次取a的地址,第二次取其中元素的值。

         其实我觉得也可以理解为汇编语言中的标号。a就相当于汇编中的标号。(可以用LABEL来进行定义变量和标号的类型),而标号一旦定义就具有三个属性:1.段地址  2.偏移地址  3.类型。      标号是不占内存,并且具有地址,我觉得用这样的方式来理解数组名也是比较合理的。如果感兴趣的朋友可以学习一下汇编语言。来了解一下。

        那么多维数组的理解方式,就比较容易了。这里以二维数组为例来进行理解。

 int i,(*p)[3],a[2][3]={1,2,3,4,5,6};
               a[2]={x,y};//抽象理解将0行的全部元素看成x,1行的全部元素看成y即可;
p=a;//指针p指向一维数组a[0]的首地址
 printf("%d",**p);//和上同理,取第一次地址是取a[0],取第二次地址才是a[0]中的元素
 printf("%d",*(*p+3));

        a就是有两个一维数组的数组。而此指针指向的就是一维数组。a就是有两个一维数组的数组。而此指针指向的就是一维数组。普通的指针指向的是数组中的元素,而该指针指向的是数组中的一维数组。

4.指针的函数调用问题

下面举一个例子来说明,指针向函数传递的问题;

int main()
{
int x=3,y=5,*p,*q;
p=&x;q=&y;
fun(p,q);
printf("%d,%d",*p,*q);
}
int fun(int *a,int *b)
{
	int *c;
	c=a;a=b;b=c;
}

此结果是 3,5

      此问题是向函数传递的是指针(也就是a和b的地址),函数用指针来接收地址,所以,在fun函数a指向x的地址,b指向y的地址。进行转换的是a和b的指向交换并没有改变p和q的指向

那么如果想改变p和q的指向应该如何进行改变呢。我们就可以用到上面所讲到的二级指针了。

int fun(int **a,int **b)
{
	int *c;
	c=*a;*a=*b;*b=c;
}
int main()
{ 
 int x=3,y=5*p=&x,*q=&y;
 fun(&p,&q);
 printf("%d,%d",*p,*q);

这是,我们向函数传递的是指针的地址,所以函数我们用二级指针来接收。在函数中定义一个一级指针;用来做转换的跳板。这时在函数中进行转换的就是p和q的指向了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_67118900/article/details/125323028

智能推荐

python工具方法35 实现SWA,再一次提升模型的性能_mmdetection swa-程序员宅基地

文章浏览阅读894次。SWA是论文Averaging Weights Leads to Wider Optima and Better Generalization所提出的一种无痛涨点的方式,只需要在模型训练的最后阶段保存模型权重,然后取模型权重的平均值,就可以提升模型的权重。按照论文描述,针对不同的模型基本上可以涨一个点。论文:SWA Object Detection详细描述了实验SWA后,模型的涨点效果。SWA的论文翻译:https://github.com/timgaripov/swa。_mmdetection swa

国内好的二本学计算机,好的二本计算机大学-程序员宅基地

文章浏览阅读351次。好的二本计算机大学有重庆邮电大学、杭州电子科技大学、桂林电子科技大学、山东科技大学、青海师范大学等,这些学校都是有计算机一级学科博士点或计算机是省部级重点学科的学校。重庆邮电大学重庆邮电大学是国家布点设立并重点建设的邮电高校之一,是工业和信息化部与重庆市共建的一所特色鲜明、优势突出,在信息通信领域具有重要影响的高水平教学研究型大学。应用计算机一级博士授权点。杭州电子科技大学杭州电子科技大学是一所电..._广西二本计算机专业学校有哪些

Oracle Data Guard_ 主库添加数据文件或创建表空间_dg 主库增加数据文件-程序员宅基地

文章浏览阅读3.9k次。8.3 Managing Primary Database Events That Affect the Standby Database8.3 管理主库能影响备库的事件To prevent possible problems, you must be aware of events on the primary database that affect a standby dat_dg 主库增加数据文件

UVa202 循环小数-程序员宅基地

文章浏览阅读74次。题目描述:给两个整数作除法,找到他们的循环小数部分。思路:  最重要的就是出现循环节的条件--当做长除法时除得的余数在此前出现过,那么循环就开始了。对这个题而言,需要将每次除得的余数和商都保存下来,再之后找到重复的那个余数后,记录出现的位置,这样可以知道括号的位置。  这个题我是完全对着测试数据来调的代码,没有细致读题,导致花了很多时间在一些细节上,代码也很凌乱。有几个..._uva202 eof

matlab 保存多个变量,Matlab将变量导出到文件心得-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏7次。目的:将字符串数组a导出到文件b.txt方法:先制造一个字符串数组>> a=char('This is a','chararray');a=This is achar array一、用fopen+fprintf(或fwrite)+fclose繁琐。有问题fid=fopen('b.txt','wt');fprintf(fid,'%s\n',a);fclose(fid);结果b.txt用记..._matlab save多个变量

java dto是什么_java项目中VO和DTO以及Entity,各自是在什么情况下应用的-程序员宅基地

文章浏览阅读7.7k次,点赞7次,收藏21次。j2ee中,经常提到几种对象(object),理解他们的含义有助于我们更好的理解面向对象的设计思维。POJO(plain old java object):普通的java对象,有别于特殊的java对象(含继承约束等)和EJB。POJO一般只有一系列的属性和相应的get、set方法。PO(persistant object):持久化对象,有别于POJO,必须对应数据库中的实体。一个PO对应数据库的一..._java dto是什么

随便推点

[技术] OIer的C++标准库 : 字符串库-程序员宅基地

文章浏览阅读119次。引入上次我在博客里介绍了OI中可能用到的STL中的功能, 今天我们接着来发掘C++标准库中能为OI所用的部分.点击传送至我的上一篇系列博文众所周知, OI中经常用到字符串相关的处理, 这时善用字符串库可以使一些操作更加简洁易懂并减少手打代码量与错误概率, 特别是在一些对效率要求不太严格的应用或者随机数据的应用下.字符串库C++的字符串库的内容主要定义在头文件<..._字符串oierc++

流行趋势:打造极具吸引力的网页导航设计-程序员宅基地

文章浏览阅读264次。  为了让你的网站脱颖而出,不仅需要有丰富的高质量的内容,同时也要兼顾网站的创新性和功能性。从用户的角度出发好好想一下,怎样让你的网站用户体验更友好?简单的搜索功能是需要的,或者你也可以精心设计一下网站的导航。同时,要注意保持整个网站设计语言的一致性。  在这个 HTML5 狂潮涌进的时代,诞生了很多优秀的网页设计作品,他们都有卓越的导航设计,接下来整理的这些网站将唤起你关于导航的极限创意,快..._页面打造专区好处

2011/5.9_qt fgetpos函数-程序员宅基地

文章浏览阅读237次。老师国外回来了,我们讨论了很久,开始研究scala_qt fgetpos函数

MySql避免"重复插入记录"的方法(INSERT ignore into,Replace into,ON DUPLICATE KEY UPDATE)_insert ignore into 影响多行-程序员宅基地

文章浏览阅读2.8k次。案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 代码如下 复制代码 1 INSERT IGNORE INTO table_name (email, phone, user_id) VALUES (‘[email protected]’, ‘99999’, ‘9999’); 这样当有重复记录就会忽略,执行后返回数字0_insert ignore into 影响多行

用python在jupyter上使用pyecharts如何保存高清图片【三】_jupyter保存图片-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏17次。使用python中的pyecharts库能够制作很精美的交互式图形(在html上渲染),但是美中不足的是其无法直接保存为图片格式的文件。网上教程主要分为两大种,但是操作均较为复杂,在这里我给大家介绍一个较为方便的解决办法,仅需在绘图代码中添加一行代码即可完成操作,并且可以手动调节图片的分辨率质量。feature下saveAsImage下的pixelRatio对应的参数是一个int类型的数字,5代表5倍分辨率,默认为1,数字越大,保存的图片越清晰,当然,文件也就越大。..._jupyter保存图片

html2canvas(将dom元素转为canvas),wxml2canvas(微信小程序)_小程序 html2canvas-程序员宅基地

文章浏览阅读5.1k次。1.安装也可以直接js文件 然后引用2. 使用3.属性widthheightx-offsety-offsetscrollXscrollY。_小程序 html2canvas