指针数组和数组指针区别

首先
数组指针是指针?还是数组?
答案是:指针。
我们已经熟悉:
整形指针: 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]

以上就是我总结的“数组指针”的使用方法,希望对大家有帮助。
我的主页还有其他文章,欢迎学习指点。
如果对你有帮助,可以点赞

数组指针(用几个例子来看看用法)相关推荐

  1. 数组指针,指针数组例子解析

    //数组与指针 /* #include<stdio.h> void main ()   {         int arr[10]={1,2,3,4,5,6,7,8,9,10};     ...

  2. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  3. C指针4:数组指针(指向数组的指针)

    先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...

  4. Delphi 的内存操作函数(2): 给数组指针分配内存

    静态数组, 在声明时就分配好内存了, 譬如: vararr1: array[0..255] of Char;arr2: array[0..255] of Integer; beginShowMessa ...

  5. (转)数组指针和指针数组的区别

    数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数 ...

  6. 指针数组,数组指针,指针函数,函数指针,二级指针详解

    先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...

  7. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  8. (C/C++学习)6.数组指针和指针数组

    说明:int (*p)[4] 和 int *p[4](数组指针和指针数组),如果你是一个初学者,也许当你看到这两个名词的时候,已经懵了.其实,只要你理解了其中的含义.这两个名词对你来说会相当简单并且很 ...

  9. 函数指针,指针函数,数组指针,指针数组 区分

    what /why/how 这些怎么区分: 函数指针:重点在指针,表示它是一个指针,它指向的是一个函数.eg: int (*fun)(); 指针函数:重点在函数,表示它是一个函数,它的返回值是指针. ...

最新文章

  1. Android与JS混编(js调用android相机扫描二维码)
  2. Redis集群管理(二)
  3. android版本sdk api对应,Android API Level与sdk版本对照表
  4. 论文浅尝 | 基于超平面的时间感知知识图谱嵌入
  5. linux7.1怎么安装vnc,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  6. 因“5毛钱”惹众怒的丰巢:我错了,下次还敢
  7. mysql binlog更新记录缺失_记一次mysql数据库binlog丢失引起的故障
  8. Android Studio安装以及Fetching android sdk component information超时的解决方案
  9. g++ -std=c++_在C ++ std库中使用sort()
  10. Git部署Git使用Git子模块
  11. telnet php,使用php实现telnet功能
  12. vue.js安装步骤教程
  13. Sqlmap常用命令总结及注入实战(Access、mysql)
  14. 无线网络技术(实验)——无线局域网组成与管理实验
  15. awk if 使用方法
  16. i78700k配什么显卡好_i7 8700k配什么主板好?适合Intel八代i7-8700k处理器搭配的主板推荐...
  17. 一个遮罩层怎么遮罩两个图层_遮罩动画是由两个图层组成的,一个是遮罩层,一个是被遮罩层。...
  18. miui11升级鸿蒙,MIUI11新版本推送 GPU驱动更新 小米10 Pro跑分轻松突破60万
  19. 那些工作中一不留神埋的雷
  20. Java 17新特性,快到起飞?

热门文章

  1. 15款js编辑器大全 收藏
  2. 唐桥云会议分组讨论——新的参会互动方式
  3. TCP/IP -- 物理层
  4. 电脑崩溃后QQ微信能登录,却打开不了网页的一种解决办法
  5. 怎么在短时间内快速提高网站排名
  6. PAT 1094 谷歌的招聘 (20 分) c语言
  7. spark写 本地文件报错
  8. 猫眼电影爬取(woff 字体文件解析)
  9. Java好学吗?现在待遇如何?
  10. Java 实现简单的发红包代码