详解C语言中的数组指针与指针数组

详解C语言中的数组指针与指针数组·详解数组指针与指针数组·数组指针一、区分首先我们需要了解什么是数组指针以及什么是指针数组,如下图:int*p[5];int(*p)[5];数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向一个大小为5的数组。所以,int(*p)[5]即为一个数组指针。int*p[5]则是一个大小为5且存放整型指针的数组。二、数组元素的指针1.定…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

·详解数组指针与指针数组

·数组指针

一、区分

首先我们需要了解什么是数组指针以及什么是指针数组,如下图:

int *p[5];
int (*p)[5];

数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向一个大小为5的数组。所以,int (*p)[5]即为一个数组指针。int *p[5]则是一个大小为5且存放整型指针的数组。

二、数组元素的指针

1.定义

指针变量既然可以指向变量,同样的,也能指向数组元素,因此,数组元素的指针就是数组元素的地址。

它的写法为:

int *p=arr;
int *p=&a[0];

这边我们需要再次明确,数组名并不代表整个数组,只是代表数组首元素的地址,因此上面两个语句是一样的。

2.运算

由于指针指向的是一个地址,因此数组指针也同样可以进行相关运算;例如指针的加减可以实现指针指向数组上一个或者下一个元素的功能。这边需要说明,数组指针中进行乘法和除法是没有意义的。

如下图所示:

详解C语言中的数组指针与指针数组

在定义指针变量的时候需要定义类型,如果指针p指向了一个数组中的一个元素,那么p+1并不是将地址加上1,而是系统判定类型之后加上一个数组元素所占用的字节数(即为p+1*d)。

3.通过指针引用数组元素

代码如下图:

#include<stdio.h>
int main()
{
	int a[10]={1,2,3,4,5,6,7,8,9,0};
	int *p;
	for(p=a ; p<(a+10) ; p++)
	{
		printf("%d ",*p);
	}
	printf("\n");
	return 0;
}

先让指针p指向a数组的首元素,打印*p(即指向数组的值),然后执行p++,使得p指向下一个元素,直到输出数组的十个元素为止。

三、通过指针引用多维数组

1.多维数组元素的地址

我们以二维数组为例,首先需要明确一点的是二维数组的首元素地址并非一个单个元素,而是首行的地址,如下图:

详解C语言中的数组指针与指针数组

下面我们列出相关地址的表示方式:

 

表示形式 含义
a     二维数组名,指向a[0]
a[0], *(a+0), *a 0行0列元素地址
a+1, &a[1] 1行首地址
a[1], *(a+1) a[1][0]的地址
a[1]+2, *(a+1)+2, &a[1][2]

a[1][2]的地址

*(a[1]+2), *(*(a+1)+2), a[1][2] a[1][2]的值

上图都是二维数组中地址的不同表示形式。

2.指向多维数组的指针变量

 

输出每一个值依然可以像一维数组一样,但这里我们可以介绍一种新的方法:

int main()
{
	int a[3][4]={
  
  {1,2,3,4},{5,6,7,8},{9,10,11,12}};
	int (*p)[4];
	int i=0;
	p=a;
	printf("%d\n",(*p)[11]);
	return 0;
}

就像我们前面的例子一样,int(*p)[12]表示定义一个指针变量,它指向一个包含12个整型元素的一堆数组。我们将其设定为12便可以存下整个a数组,当然也可以存一行4个,最后如果输出的话就方便了许多。

四、数组指针作函数参数

下面是几种传参的方式:

void test()
{
 int arr[3][5] = {0};
 print(arr);
}
void print(int arr[3][5])
{}
void print(int arr[][5])
{}
void print(int **arr)
{}
void print(int (*arr)[5])
{}

我们可以看出第三种方式明显是不行的,这边引用了一个二级指针,但是我们上面提到过数组的地址应该放到数组指针中去。而第四种方法就是我们上面提到过的,而这种方式是可行的。

下面是一个一级指针传参的例子:

#include <stdio.h>
void print(int *p, int sz)
{
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d\n", *(p+i));
 }
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9};
 int *p = arr;
 int sz = sizeof(arr)/sizeof(arr[0]);
 print(p, sz);
 return 0;
}

·指针数组

一、指针数组

1.定义

 

int *p[5];

上面使我们刚开始举出的例子,这就是一个最简单的指针数组。因此我们可以得出指针数组的定义。指针数组:一个数组的元素均为指针类型数据,称为指针数组。

假设我们定义一个数组,各个元素指向不同的字符串,如下图:

详解C语言中的数组指针与指针数组

上图所示,我们定义一个指针数组arr,然后把各字符串的地址赋给各个元素,即arr[0]和arr[1]。

详解C语言中的数组指针与指针数组

通过一个简单的函数就可以进行输出了。

二、指向指针数据的指针

首先我们可以定义一个指向指针数据的指针变量:

char **p;

为了方便我们理解,其实**p也就等于*(*p)。*p表示p为一个指针变量,前面的*表示*p指向的是char *类型的数据。换一句话来说,如果引用*p,就是得到p所指向的值,如果拿上面的例子来说就是字符串”Hello”和”World”。

我们可以通过下面的代码来实现:

int main()
{
	char *arr[]={"Hello","World"};
	char **p;
	int i;
	for(i=0; i<2; i++)
	{
		p=arr+i;
		printf("%s ",*p);
	}
	return 0;
}

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157479.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • windows server搭建邮件服务器(开源邮件服务器系统)

    使用WinmailServer轻松架设邮件服务器准备工作  WinmailServer是一款安全易用全功能的邮件服务器软件,不仅支持SMTP/POP3/IMAP/Webmail/LDAP(公共地址簿)/多域/发信认证/反垃圾邮件/邮件过滤/邮件组/公共邮件夹等标准邮件功能,还有提供邮件签核/邮件杀毒/邮件监控/支持IIS,Apache和PWS/短信提醒/邮件备份/TLS(

    2022年4月17日
    1.3K
  • 搭建Eurake服务「建议收藏」

    搭建Eurake服务「建议收藏」Eureka注册中心Eureka的作用消费者该如何获取服务提供者具体信息?服务提供者启动时向eureka注册自己的信息eureka保存这些信息消费者根据服务名称向eureka拉取提供者信息如果有多个服务提供者,消费者该如何选择?服务消费者利用负载均衡算法,从服务列表中挑选一个消费者如何感知服务提供者健康状态?服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状eureka会更新记录服务列表信息,心跳不正常会被剔除消费者就可以拉取到最新的信息

    2022年6月1日
    35
  • mysql创建数据库的步骤_sql创建数据库代码

    mysql创建数据库的步骤_sql创建数据库代码作者介绍:陈东明,饿了么北京技术中心架构组负责人,负责饿了么的产品线架构设计以及饿了么基础架构研发工作。曾任百度架构师,负责百度即时通讯产品的架构设计。具有丰富的大规模系统构建和基础架构的研发经验,善于复杂业务需求下的大并发、分布式系统设计和持续优化。个人微信公众号dongming_cdm。Tedis(https://github.com/eleme/tedis)是基于开源TiKV…

    2022年9月16日
    0
  • java权限修饰符

    java权限修饰符

    2021年9月29日
    39
  • pycharm2021年激活码刚出_最新在线免费激活

    (pycharm2021年激活码刚出)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S3…

    2022年3月26日
    40
  • bootstrap-datepicker使用

    bootstrap-datepicker使用

    2021年11月5日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号