数组指针(用几个例子来看看用法)
指针数组和数组指针区别
首先
数组指针是指针?还是数组?
答案是:指针。
我们已经熟悉:
整形指针: int * pint;
能够指向整形数据的指针。
浮点型指针: float * pf;
能够指向浮点型数据的指针。
那数组指针应该是:能够指向数组的指针。
下面代码哪个是数组指针?
int *p1[10];
int (*p2)[10];
p1, p2分别是什么?
p1是指针数组,p2是数组指针
解释:
int (*p)[10];
解释:p先和*结合,说明p是一个指针变量,然后指向的是什么呢?指针指向的是一个大小为10的数组,数组元素是什么呢?数组元素是整型int。所以p是一个指针,指向一个数组,叫数组指针。
/这里要注意:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
用几个例子来简单看下数组指针的用法
数组指针的用法1
我们需要打印 arr[10] = {1,2,3,4,5,6,7,8,9,10}数组中的元素,有下面几个方法
void print1(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
void print2(int* arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(arr + i));}
}//数组指针
void print3(int (*parr)[10], int sz)//这是一个错误的示范
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", parr[i]);//parr[i] == *(parr+i)}
}void print4(int (*parr)[10], int sz)
{//*(parr + 0);//parr[0]int i = 0;for (i = 0; i < sz; i++){//printf("%d ", parr[0][i]);//printf("%d ", (*(parr + 0))[i]);printf("%d ", (*parr)[i]);//(*parr) 相当于 parr指向的数组的数组名//上面三个写法等价}
}int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int sz = sizeof(arr) / sizeof(arr[0]);print4(&arr, sz);//print3(&arr, sz);//print2(arr, sz);//print1(arr, sz);//打印arr数组的内容return 0;
}
print4用的数组指针,可以看出来用起来很别扭,以上打印arr数组的内容,建议直接用print1和print2。
另外,有人可能会疑惑&arr和arr的区别,可以看看我的这篇博客&arr(&数组名)和arr(数组名)的区别|内附具体实例(新手易懂)
那什么场景下数字指针用起来会比较好呢?
数组指针的用法2
我们要打印二维数组arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6,3,4,5,6,7 }的内容。给出以下两种方法
void print1(int arr[3][5], int r, int c)//参数部分也是二维数组
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){printf("%d ", arr[i][j]);}printf("\n");}
}//数组指针
void print2( int(*p)[5], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){//printf("%d ", *(*(p + i) + j));printf("%d ", p[i][j]);}printf("\n");}
}int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6,3,4,5,6,7 };//print1(arr, 3, 5);//二维数组传参print2(arr, 3, 5);//arr 是数组名,数组名是首元素地址return 0;
}
来说一下使用数组指针的print2
arr 是数组名,数组名是首元素地址
这里的首元素就是二维数组arr的第一行的地址,第一行的地址,就是有5个整型元素的一维数组的地址,所以数组名就是二维数组第一行这个一维数组(1 2 3 4 5)的地址。
一维数组的地址也是个数组的地址嘛,数组的地址就要存在数组指针里去。这个指针就这样写:int(*p)[5]
书写数组指针的方法:
书写数组指针的方法:首先
(*p)
这是一个指针,指向的数组有五个元素[5]
,元素的类型是int,所以写做int(*p)[5]
注意:int(*p)[5]
这个是指向一维数组的指针,而不是二维数组的。
对于printf("%d ", *(*(p + i) + j);
这一句,p + i
表示指向某一行,解引用一下*(p + i)
,相当于拿到这一行的数组名了,我们在这一行又要找到这一行的某个元素,就用j来设置一个循环,起始地址加上一个j,*(p + i) + j
,找到下标为j的元素,再解引用一下,*(*(p + i) + j)
就找到i行j列的元素了,然后就能打印出来了。
*(*(p + i) + j)
这个写法等价于 p[i][j]
。
以上就是我总结的“数组指针”的使用方法,希望对大家有帮助。
我的主页还有其他文章,欢迎学习指点。
如果对你有帮助,可以点赞
数组指针(用几个例子来看看用法)相关推荐
- 数组指针,指针数组例子解析
//数组与指针 /* #include<stdio.h> void main () { int arr[10]={1,2,3,4,5,6,7,8,9,10}; ...
- 关于C语言中的数组指针、指针数组以及二级指针
概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...
- C指针4:数组指针(指向数组的指针)
先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...
- Delphi 的内存操作函数(2): 给数组指针分配内存
静态数组, 在声明时就分配好内存了, 譬如: vararr1: array[0..255] of Char;arr2: array[0..255] of Integer; beginShowMessa ...
- (转)数组指针和指针数组的区别
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数 ...
- 指针数组,数组指针,指针函数,函数指针,二级指针详解
先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- (C/C++学习)6.数组指针和指针数组
说明:int (*p)[4] 和 int *p[4](数组指针和指针数组),如果你是一个初学者,也许当你看到这两个名词的时候,已经懵了.其实,只要你理解了其中的含义.这两个名词对你来说会相当简单并且很 ...
- 函数指针,指针函数,数组指针,指针数组 区分
what /why/how 这些怎么区分: 函数指针:重点在指针,表示它是一个指针,它指向的是一个函数.eg: int (*fun)(); 指针函数:重点在函数,表示它是一个函数,它的返回值是指针. ...
最新文章
- Android与JS混编(js调用android相机扫描二维码)
- Redis集群管理(二)
- android版本sdk api对应,Android API Level与sdk版本对照表
- 论文浅尝 | 基于超平面的时间感知知识图谱嵌入
- linux7.1怎么安装vnc,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 因“5毛钱”惹众怒的丰巢:我错了,下次还敢
- mysql binlog更新记录缺失_记一次mysql数据库binlog丢失引起的故障
- Android Studio安装以及Fetching android sdk component information超时的解决方案
- g++ -std=c++_在C ++ std库中使用sort()
- Git部署Git使用Git子模块
- telnet php,使用php实现telnet功能
- vue.js安装步骤教程
- Sqlmap常用命令总结及注入实战(Access、mysql)
- 无线网络技术(实验)——无线局域网组成与管理实验
- awk if 使用方法
- i78700k配什么显卡好_i7 8700k配什么主板好?适合Intel八代i7-8700k处理器搭配的主板推荐...
- 一个遮罩层怎么遮罩两个图层_遮罩动画是由两个图层组成的,一个是遮罩层,一个是被遮罩层。...
- miui11升级鸿蒙,MIUI11新版本推送 GPU驱动更新 小米10 Pro跑分轻松突破60万
- 那些工作中一不留神埋的雷
- Java 17新特性,快到起飞?