详解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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python df.iloc_python中loc

    python df.iloc_python中locstackoverflow原文:pandasilocvsixvslocexplanation;howaretheydifferent?在pandas0.20.0及以上版本,ix已经被loc和iloc取代了,因此不讨论它。前提,简单介绍一下它俩:–loc利用index的名称,来获取想要的行(或列)。–iloc利用index的具体位置(所以它只能是整数型参数),…

    2022年10月9日
    6
  • Azure虚拟机中使用Tracert/Traceroute/MTR(My Traceroute)的原理讨论

    Azure虚拟机中使用Tracert/Traceroute/MTR(My Traceroute)的原理讨论命令:mtrXXX.XXX.XXX.XXX效果: 如果加上-n参数可以显示IP而不是反向解析成域名:例如mtr-nXXX.XXX.XXX.XXX mtr的工作原理:利用IP报文头部的TTL值来进行探测 我们以目标IP为106.120.78.190为例:抓包见附件,我们看到如下的交互过程:前4个报文展开来看:第一个:第二个:

    2022年6月16日
    27
  • 快速排序quicksort_快速排序的原理

    快速排序quicksort_快速排序的原理一、简介快速排序是(Quicksort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。二、算法思路快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。大致步骤如下:首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部

    2022年8月12日
    6
  • 智能视频识别技术的发展现状「建议收藏」

    智能视频识别技术的发展现状「建议收藏」一、智能视频分析技术应用现状  作为强化视频监控系统应用的一门主要技术——视频智能分析技术,近几年一直得到业界的广泛的关注,其通过对视频内容的分析,将客户所关注的目标从监控背景中分离出来,按照目标的移动方向、速度、时间等参数和某些行为特征进行关联,从而达到主动监控防御的目的。按说这一技术的大规模推广应用对于提高当前治安监控系统的利用效率将起到很大的作用,但实际上却没有得到有效的推广,所谓“叫好不叫座”。笔者认为,造成这一现象的主要原因有以下几个方面:【您可以是大型系统集成商、可以是相关贸易的经销商.

    2022年4月30日
    78
  • 那年那兔那些事观后感600字_那年那兔那些事儿金句

    那年那兔那些事观后感600字_那年那兔那些事儿金句我们生活在现在,吃得饱穿的暖。但是总觉得自己很不幸福。需要那么努力的去奋斗。抱怨社会的不公平。然而世界上什么时候公平过。我们都快忘了从八国联军侵华的时候开始什么时候公平过。从有了人便有了三六九等谈什

    2022年8月3日
    24
  • 错误解决:widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams

    错误解决:widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParamsandroid.widget.FrameLayout$LayoutParamscannotbecasttoandroid.widget.LinearLayout$LayoutParams。LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,0);

    2022年9月21日
    3

发表回复

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

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