·详解数组指针与指针数组

·数组指针

一、区分

首先我们需要了解什么是数组指针以及什么是指针数组,如下图:

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)[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];

上面使我们刚开始举出的例子,这就是一个最简单的指针数组。因此我们可以得出指针数组的定义。指针数组:一个数组的元素均为指针类型数据,称为指针数组。

假设我们定义一个数组,各个元素指向不同的字符串,如下图:

上图所示,我们定义一个指针数组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语言中的数组指针与指针数组相关推荐

  1. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  2. 武林c语言,详解C语言中条件编译

    预处理器提供条件编译,程序的不同部分可以在不同的条件下编译,从而产生不同的目标代码文件,这对于程序移植和调试非常有用,本文是武林技术频道小编给为大家带来的详解中条件编译,一起来了解一下吧! 通常情况, ...

  3. c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...

  4. 一万字详解C语言中长度为零的数组

    点击蓝字 关注我们 零长度数组概念: 众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展. ...

  5. c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include 总结 以上 ...

  6. C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <s ...

  7. c语言中文字符串数组,详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include #incl ...

  8. c语言指针常量和常量指针,详解C语言中的常量指针和指针常量

    概述对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区 ...

  9. c语言中的字符串数组,详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include #incl ...

最新文章

  1. c语言潮流计算验证30节点,C语言潮流计算研究报告.doc
  2. application.properties/yml文件读取
  3. 一、Vue基础语法学习笔记系列——插值操作(Mustache语法、v-once、v-html、v-text、v-pre、v-cloak)、绑定属性v-bind(绑定class、style)、计算属性
  4. 知乎万赞回答!如何在一周内快速摸清一个行业?
  5. Linux 下查看线程信息
  6. Spring,FetchType.LAZY和FetchType.EAGER什么区别?
  7. K8S认证、授权与准入控制(RBAC)详解
  8. 使用cmd命令创建maven(web)项目+项目转换成IDEA项目+项目打包+Jetty运行Web项目
  9. matlab水汽计算公式,饱和水汽压的计算
  10. 中职计算机ps公开课教案,Photoshop教案(公开课).doc
  11. java学习代码01 范围:基本测试、标识符、数据类型、运算符、控制语句
  12. 学习记录:python快递价格计算器练习7.12
  13. win10 appdata文件夹在哪 隐藏文件夹appdata的打开方法
  14. MATLAB | 画彩色图像的直方图,改对比度,计算均值、方差和信息熵
  15. 大话2正在连接登录服务器,大话西游手游服务器连接失败进不去解决办法
  16. 【应用笔记】【AN002】通过iTool2基于MinGW平台读写EEPROM
  17. 自动作文评分算法概述
  18. 【神经网络与深度学习】1.线性分类与感知机
  19. 基于python的量化投资(二) ---- 获取量化数据
  20. 房企买房送车位的涉税风险

热门文章

  1. XML解析之DOM解析详解
  2. Java语言的十大特性
  3. 计算机管理中的服务ssl,关于3389远程桌面使用SSL加密登录解决方案Windows服务器操作系统 -电脑资料...
  4. ERP渠道信息的修改和渠道联系记录(二十三)
  5. 问题 :(c语言)箱子匹配
  6. python分布式计算_《Python分布式计算》第1章 并行和分布式计算介绍 (Distributed Computing with Python)...
  7. 检验样本是否服从正态分布,处理偏态分布
  8. html图片幕墙特效,jQuery和CSS3炫酷可交互的图片墙特效
  9. 多元正态分布的参数估计
  10. 楚楚街2016招聘笔试(旅途)(未完待续)