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

int main()

{

int a[10]={1,2,3,4,5,6,7,8,9,0};

int *p;

for(p=a ; p

{

printf("%d ",*p);

}

printf("

");

return 0;

}

先让指针p指向a数组的首元素,打印*p(即指向数组的值),然后执行p++,使得p指向下一个元素,直到输出数组的十个元素为止。

三、通过指针引用多维数组

1.多维数组元素的地址

我们以二维数组为例,首先需要明确一点的是二维数组的首元素地址并非一个单个元素,而是首行的地址,如下图:

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

表示形式含义

a    二维数组名,指向a[0]

a[0], *(a+0), *a0行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

",(*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

void print(int *p, int sz)

{

int i = 0;

for(i=0; i

{

printf("%d

", *(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;

}

参考博文:

指针数组与数组指针详解:

C语言指针详解(经典,非常详细)

c语言数组指针移位,C语言数组指针_3相关推荐

  1. C语言基础1:初识C语言(转义、注释;数组、操作符、反码、补码、static、define、指针、结构体常变量;局部变量;作用域、生命周期)

    文章目录 C语言基础1:初识C语言 1.C语言简介 1.1什么是C语言 1.2C语言的发展 2.第一个C语言程序 2.1创建项目 2.2添加源文件 2.3写代码 3.数据类型 4.变量.常量 4.1定 ...

  2. 【C 语言】结构体相关 的 函数 指针 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...

  3. C语言指针和二维数组

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, ...

  4. C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt

    C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...

  5. c语言指针数组 难点总结,C语言之指针与数组总结

    和指针相关的问题口诀1: 1. 地址变量得地址,得谁地址指向谁 和指针相关的问题要画图: 内容变量画房子,指针画箭头 ---->口 ------------------------------- ...

  6. C语言中的二级指针和二维数组问题

    关于二级指针和二维数组两者差别很大,不可以直接用二级指针传递二维数组 首先来看看二维数组在内存中是如何组织的呢? 一维数组 T arr1 = new T[9]  二维数组T arr2 = new T[ ...

  7. c语言字符数组给字符指针,C语言常见有关问题之字符串数组和字符指针数组有关问题...

    C语言常见问题之字符串数组和字符指针数组问题 通过如下的实例来讲解这个问题: #include int main(void) { char a[3][4] = {"123", &q ...

  8. c语言数组数据用指针查找,c语言数组与指针_指针篇_2011.ppt

    c语言数组与指针_指针篇_2011 指 针 6.2 指针的概念6.3 指针与数组6.4 字符串的指针6.5 指针数组和指向指针的指针;6.2.1 地址与指针的概念 ;指针的概念;内存地址;2.数组与地 ...

  9. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  10. c语言 地址+1,C语言中,为什么指针表达式的值+1.对应的地址值却+4?/为什么两个数组元素的地址相减之差不为地址之差?...

    在C语言中,我们常常用到的一个运算是让某个变量的值+1. 例如 M = M + 1. 而在实际运用中,我们发现 对于指针进行+1运算,算出来的结果是+4. 如下图 图中我们定义的 变量M 和指针Mat ...

最新文章

  1. 【干货】产品经理的需求管理
  2. 每天只能发十篇文章的限制引发的连锁反应
  3. CAS 5.2.x 单点登录 - 实现原理及源码浅析
  4. 在Metro App中显示Toast notification
  5. 第十六课、Qt对象间的父子关系------------------狄泰软件学院
  6. LINQ访问DataTable
  7. 【CodeForces - 988C 】Equal Sums (思维,STLmap,STLset,tricks)
  8. 2018.08.09洛谷P3959 宝藏(随机化贪心)
  9. 谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目
  10. js插件编写常用工具函数及格式
  11. 【Java从0到架构师】MyBatis - 查询
  12. 电大计算机考试将网页保存到桌面,电大计算机网考小抄.pdf
  13. centos7安装图形界面
  14. OpenCV:旋转矩形(RotatedRect)
  15. 堆载预压弹性变形怎样计算公式_支架载荷计算公式
  16. 关于DSP的SCI通信学习
  17. Java中的七种设计原则
  18. Webstorm添加新建文件类型 创建文件模板
  19. PHP网站升级https后如何引用http直播源hls?
  20. UCK Network为区块链生态环境搭建一个完善自循环供水系统

热门文章

  1. 【音乐拼接】mp3格式
  2. 值得关注的5款低代码平台推荐
  3. Appium下载安装与配置
  4. 2021年安全生产模拟考试(全国特种作业操作证电工作业-电力电缆模拟考试题库二)安考星
  5. 财务数据分析工作总结汇报PPT模板
  6. 大神级ppt作品欣赏_超写实绘画,逼真到让你怀疑自己的双眼,各路超写实大神作品欣赏...
  7. “盈利为王”运营商财务管理沙盘--徐凌云老师
  8. 如何做中台战略分析模型?
  9. opendds简单入门(二)
  10. LeetCode答案详解