C语言数组指针
C语言中的数组指针与指针数组:
·数组指针
一、区分
首先我们需要了解什么是数组指针以及什么是指针数组,如下:
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.运算
由于指针指向的是一个地址,因此数组指针也同样可以进行相关运算;例如指针的加减可以实现指针指向数组上一个或者下一个元素的功能。这边需要说明,数组指针中进行乘法和除法是没有意义的。
如下图所示:

在定义指针变量的时候需要定义类型,如果指针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.多维数组元素的地址
我们以二维数组为例,首先需要明确一点的是二维数组的首元素地址并非一个单个元素,而是首行的地址,如下图:

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

表示形式 含义
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)[12];
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];
上面使我们刚开始举出的例子,这就是一个最简单的指针数组。因此我们可以得出指针数组的定义。指针数组:一个数组的元素均为指针类型数据,称为指针数组。
假设我们定义一个数组,各个元素指向不同的字符串,如下图:

上图所示,我们定义一个指针数组arr,然后把各字符串的地址赋给各个元素,即arr[0]和arr[1]。
通过一个简单的函数就可以进行输出了。
二、指向指针数据的指针
首先我们可以定义一个指向指针数据的指针变量:
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://blog.csdn.net/men_wen/article/details/52694069
C语言指针详解(经典,非常详细)
https://blog.csdn.net/constantin_/article/details/79575638
C语言数组指针的更多相关文章
- c语言——数组指针和通过指针引用数组元素的方法总结
1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢?int (* p)[10]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/1拓展:有指针类型元素的数组称为指针数组. 2. ...
- C语言-数组指针与指针数组
1.思考 下面这些声明合法吗? int array[5]; int matrix[3][3]; int * pa = array; int * pm = matrix; 问题: array代表数组首元 ...
- C语言数组指针(指向数组的指针)
注意:数组指针的定义,与指针数组的区别 转载:http://c.biancheng.net/cpp/biancheng/view/162.html 指向多维数组元素的指针变量 ① 指向数组元素的指针变 ...
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- C语言 数组做函数参数退化为指针的技术推演
//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...
- C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别
1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...
- c语言指针数组与数组指针
一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- C语言 > 数组和指针
C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...
随机推荐
- Java ceil() 方法
语法: double ceil(double d) double ceil(float f) 参数 double 或 float 的原生数据类型. 返回值 返回 double 类型,返回值大于或等于给 ...
- EL函数库及用法
导入标签库: <%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%&g ...
- 『TensotFlow』转置卷积
网上解释 作者:张萌链接:https://www.zhihu.com/question/43609045/answer/120266511来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Spring cloud系列之Zuul配置项中sensitiveHeaders和ignoredHeaders
sensitiveHeaders:会过滤客户端请求中的和该配置项匹配的headers比如: zuul: sensitiveHeaders: X-ABC 如果客户端在发请求是带了X-ABC,那么X-AB ...
- excel中如何把文本转换为数字
今天被一个小问题难住了,本人用自己开发的成绩分析软件统计学校成绩,数据由excel导入,给我的数据全部是文本型,其实也不难,主要是我的软件是早期开发的,没有考虑这个问题,结果这个问题被美女老师解决了 ...
- Java 代理
代理做一个简单的抽象: 代理模式包含如下角色: Subject:抽象主题角色.可以是接口,也可以是抽象类. RealSubject:真实主题角色.业务逻辑的具体执行者. ProxySubject:代理 ...
- JS之event flow
DOM事件流 1.定义: DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素节点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM ...
- 《JavaScript Dom 编程艺术》读书笔记-第8章
充实文档的内容,包括几个方面: 一个为文档创建“缩略图列表”的函数: 一个为文档创建“文献来源链接”的函数: 一个为文档创建“快捷键清单”的函数. <abbr>在HTML5 中以取代< ...
- Effective java第17条:要么为继承而设计,并提供文档说明,要么就禁止继承
不要过度设计. 面向对象编程,从一开始被洗脑难免在上手写代码时都会首先思考有没有公共方法啊,能不能把两个类抽象成一个父类再继承啊等,慎重使用继承,当要使用继承时一定要在文档注释中写明重写这个方法会给其 ...
- 测试同学必备抓包工具--charles之安装
1,下载charles,官网:https://www.charlesproxy.com/ 2,下载完成,先试着用一下,网址访问百度看看... 注意,windows proxy如果勾选,则代表可以抓取网 ...