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


相关推荐

  • Circular buffer

    Circular buffer

    2022年1月16日
    46
  • 逆变电源的计算机控制系统,一种专用三相逆变电源控制系统研究

    逆变电源的计算机控制系统,一种专用三相逆变电源控制系统研究摘要:三相逆变器作为交流电源的主要部分,已经广泛应用于工业、能源、交通、运输等领域。本课题研究的三相逆变电源主要应用于船舶的供电系统,为汽轮发电机组交流电动辅油泵和柴油发电机组电动泵提供可靠不间断的三相交流电,能够适应负载直接启动、恒压频比启动等操作。当船电正常时,船电经过整流滤波后通过Boost升压电路为逆变电路提供直流电,当船电故障时,由蓄电池经过升压电路为逆变电路提供直流电。在两种输入电压切…

    2022年6月6日
    34
  • getchar的使用

    1.从缓冲区读走一个字符,相当于清除缓冲区2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和…

    2022年4月5日
    101
  • py2exe怎么安装_py安装及开发环境设置

    py2exe怎么安装_py安装及开发环境设置一、简介py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序。py2exe已经被用于创建wxPython,Tkinter,Pmw,PyGTK,pygame,win32comclient和server,和其它的独立程序。py2exe是发布在开源许可证下的。目前只有py…

    2022年9月11日
    0
  • idea2021.1.4激活码【最新永久激活】

    (idea2021.1.4激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月26日
    246
  • SecureCRT中文乱码问题的解决

    SecureCRT中文乱码问题的解决SecureCRT中文乱码问题的解决最近开始使用SecureCRT,但发现中文一直是乱码:上网搜查时编码问题,于是就把编码改为了UTF-8: 然而并没有解决问题,中文变成了?:编码修正后,还是不行,点击Font,发现字符集是西文,马上修改成中文GB2312 确定保存后,中文正常显示了: 小结:影响中文显示一般先考虑编码方式,再考虑字符集设置。…

    2022年7月17日
    13

发表回复

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

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