C语言 数组指针详解
1.一维数组指针
1.1 定义
数组指针,即指向数组的指针,对于一维数组char cTestOne[3] = {1, 2, 3},定义指向其的指针:char (*pOneArray)[3] = &cTestOne。
1.2 地址空间
&cTestOne和cTestOnep值相同,但意义不同,前者表示的是整个数组的首地址,后者表示的是数组第一个元素的地址。OneArray+1在地址空间上表示的是增加数组长度的地址,这与char (*pOneArray)[3]中的char类型和[3]长度相关,我们定义char *pOneElement1 = cTestOne,pOneElement1+1在地址空间上表示的是增加数组单个元素长度的地址。
1.3 访问
对于pOneArray,*pOneArray表示的首个元素的地址,**pOneArray则表示首个元素的值;对于pOneElement1 ,其本身表示首个元素的地址,*pOneElement1 表示首个元素的值。
1.4 测试
测试代码:
char cTestOne[3] = {1, 2, 3};//指向一维数组char (*pOneArray)[3] = &cTestOne;//指向数组的第一个元素写法1char *pOneElement1 = cTestOne;//指向数组的第一个元素写法2char *pOneElement2 = &(cTestOne[0]);//地址空间printf("****************Address DisPlay****************\n");printf("&cTestOne = %p\n",&cTestOne);printf("cTestOne = %p\n",cTestOne);printf("&(cTestOne[0] = %p\n",&(cTestOne[0]));printf("pOneArray = %p\n",pOneArray);printf("pOneElement1 = %p\n",pOneElement1);printf("pOneElement2 = %p\n\n",pOneElement2);//步距测试printf("****************Step Length DisPlay****************\n");printf("&cTestOne + 1 = %p\n",&cTestOne + 1);printf("pOneArray + 1 = %p\n",pOneArray + 1);printf("pOneElement1 + 1 = %p\n",pOneElement1 + 1);printf("pOneElement2 + 1 = %p\n\n",pOneElement2 + 1);//元素访问printf("****************Element Access DisPlay****************\n");printf("*pOneArray = %p\n",*pOneArray);printf("**pOneArray = %d\n",**pOneArray);printf("*(*pOneArray + 1) = %d\n",*(*pOneArray + 1));printf("*pOneElement1 = %d\n",*pOneElement1);printf("*(pOneElement1 + 1) = %d\n",*(pOneElement1 + 1));printf("*(pOneElement2 + 1) = %d\n\n",*(pOneElement2 + 1));
测试结果:
2.二维数组指针
2.1 地址空间
对于二维数组,可以看做一个一维数组,其成员变量也是一维数组;定义char cTestTwo[2][3] = {1, 2, 3, 4, 5, 6},&cTestTwo表示的是整个数组的指针,&cTestTwo + 1步距为6(2乘以3,整个数组的长度);cTestTwo表示第0行的首地址,即cTestTwo[0]的地址,类似于上述章节中一维数组的&cTestOne,其步距为3(每行的长度);*cTestTwo表示的是数组第0个元素的地址,即cTestTwo[0][0]的地址。
2.2 访问
由2.1章节描述,数组第0行地址为cTestTwo,第0个元素地址为*cTestTwo,访问第0行第0个元素即为**cTestTwo;对于第0行第1个元素,即*(*cTestTwo + 1);对于第1行的第0个元素,其行起始地址为(cTestTwo + 1),访问即为*(*(cTestTwo + 1)),对于第1行第1个元素,访问即为*(*(cTestTwo + 1) + 1);总结:访问第M行第N个元素,即*(*(cTestTwo + M) + N)
2.3 测试
测试代码:
//指向二维数组char cTestTwo[2][3] = {1, 2, 3, 4, 5, 6};char (*pTwoArray)[2][3] = &cTestTwo;char (*pTwoArrayOneLine)[3] = cTestTwo;//指向数组的第一个元素char *pTwoElement = (*cTestTwo);//地址空间printf("****************Address DisPlay****************\n");printf("&cTestTwo = %p\n",&cTestTwo);printf("cTestTwo = %p\n",cTestTwo);printf("*cTestTwo = %p\n",*cTestTwo);printf("pOneArray = %p\n",pTwoArray);printf("pTwoArrayOneLine = %p\n",pTwoArrayOneLine);printf("pTwoElement = %p\n\n",pTwoElement);//步距测试printf("****************Step Length DisPlay****************\n");printf("&cTestTwo + 1 = %p\n",&cTestTwo + 1);printf("cTestTwo + 1 = %p\n",cTestTwo + 1);printf("*cTestTwo + 1 = %p\n",*cTestTwo + 1);printf("pOneArray + 1 = %p\n",pTwoArray + 1);printf("pTwoArrayOneLine + 1 = %p\n",pTwoArrayOneLine + 1);printf("pTwoElement + 1 = %p\n\n",pTwoElement + 1);//元素访问printf("****************Element Access DisPlay****************\n");printf("**cTestTwo = %d\n",**cTestTwo);printf("*(*cTestTwo + 1) = %d\n",*(*cTestTwo + 1));printf("*(*(cTestTwo + 1)) = %d\n",*(*(cTestTwo + 1)));printf("*(*(cTestTwo + 1) + 1) = %d\n\n",*(*(cTestTwo + 1) + 1));printf("**pTwoArrayOneLine = %d\n",**pTwoArrayOneLine);printf("*(*pTwoArrayOneLine + 1) = %d\n",*(*pTwoArrayOneLine + 1));printf("*(*(pTwoArrayOneLine + 1)) = %d\n",*(*(pTwoArrayOneLine + 1)));printf("*(*(pTwoArrayOneLine + 1) + 1) = %d\n\n",*(*(pTwoArrayOneLine + 1) + 1));printf("*pTwoElement = %d\n",*(pTwoElement + 0));printf("*(pTwoElement + 1) = %d\n",*(pTwoElement + 1));printf("*(pTwoElement + 3) = %d\n",*(pTwoElement + 3));printf("*(pTwoElement + 4) = %d\n\n",*(pTwoElement + 4));
测试结果:
C语言 数组指针详解相关推荐
- php 数组 指针,php之数组指针详解
本文主要和大家分享php之数组指针详解,首先我们会和大家分享php 数组指的针操作方法,希望能帮助到大家. 一.php 数组指针操作 利用php的内置函数:key,current,next(),pre ...
- 指针数组与数组指针详解
指针数组与数组指针详解 1.什么是指针数组和数组指针? 指针数组:指针数组可以说成是"指针的数组",首先这个变量是一个数组,其次,"指针"修饰这个数组,意思是说 ...
- c语言的指针详解ppt,最全的C语言指针详解.ppt
最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...
- C语言指针数组和数组指针详解
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- C语言之指针数组与数组指针详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.指针数组 一维指针数组的基本使用 一维指针数组的进阶使用 二.数组指针 - 数组为一维数组 - 数组为二维数组时 ...
- 关于指针数组与数组指针详解(知识点全面)
1.目录 1.指针数组 2.数组指针 2.它们的区别 1.指针数组 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.其一般形式为: 数据类型 *数组名[常量表达式][常量表达式 ...
- c语言handler指针,详解C++ new-handler机制
当 operator new 不能满足一个内存分配请求时,它抛出一个 exception(异常).很久以前,他返回一个 null pointer(空指针),而一些比较老的编译器还在这样做.你依然能达到 ...
- 一看就会的C语言数组(详解易懂)
目录 1. 一维数组的创建和初始化. 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二 ...
- 如何给6个整数的一维数组某个元素赋值_数组指针详解
文章部分资料来源: Pointer to an Array | Array Pointer - GeeksforGeekswww.geeksforgeeks.org 介绍数组指针之前,先来回顾指针: ...
- c++二维数组指针详解
记住很重要的一点:数组名=&数组名[0],比如,对于二维数组a[3][4] ,a等同于&a[0],a[0]等同于&a[0][0] int main() { int a[3][4 ...
最新文章
- flink mysql日志,关于flink的日志文件设置
- 机房收费--上机状态查询
- linux文件系统启动流程,linux 内核启动过程以及挂载android 根文件系统的过程
- iOS之深入解析图片解压缩到渲染的过程与原理
- Linux下的USB总线驱动(04)——USB键盘驱动 usbkbd.c
- python发邮件有什么意思_python发邮件要装什么
- C# 两个类之间传递数据
- 七、内存、寄存器数据的传送
- vm和openstack_最佳新OpenStack技巧和窍门
- (MATLAB)使用梯度下降进行一元线性回归
- rest api是什么_如何选择合适的API测试工具
- python3 写九九乘法表(python 小白进阶之旅)
- VPC、快照、重置密码、重启、关机、扩容
- keras非线性回归代码专题
- vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。
- 2015百度之星初赛(1)1006 旋转卡壳
- Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化
- Android实现扫一扫识别图像数字(镂空图像数字Tesseract训练)(上)
- 阿里云域名解析网络和服务架构设计总概览(一)
- 六年探索,见证程序化交易的惊人威力 --- 第一篇