C语言初学者关于数组指针的深度讨论
一、什么是数组指针?
即是数组的指针。首先它是一个指针,指向数组,指针本身占4个字节。
二、数组指针的使用
int a[3][5];
int (*p)[5];
p=&a; 第二行定义了一个数组指针,p是指针名,指向一个含有5个int类型数据的数组。注意括号一定不要省略,否则就是指针数组。
第三行将数组a首地址赋值给指针。
三、为什么要使用数组指针?
使用数组指针是为了更方便地操作二维数组。来看栗子:
int a[3][5]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int (*p)[5]=&a;
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("a[%d][%d]=%d\n",i,j,a[i][j]);
}
}
printf("\n");
printf("\n");
printf("a[1][2]=%d\n",p[1][2]);
printf("a[2][3]=%d\n",p[2][3]);
运行结果显示,a[1][2]==p[1][2],a[2][3]==p[2][3],完全没有问题。当然,这是是指针的数组表示方法。
p[1][2]可以转化为 *(*(p+1)+2)这是指针传统的表示方法。
有人认为,定义一个普通的指针变量来操作二维数组也没问题啊,现在在上面的代码中加入如下:
int *q=&a;
此时该如何用指针q表示a[1][2]呢?有两种方法,一种是指针的传统表示方法:*(q+8);另一种是数组表示法:q[8]。
这时候,“8”是程序员人为计算出来的,不方便,因此操作二维数组用数组指针更适合。
四、详细理解*(*(p+1)+2)
二维数组,即数组的数组,如果一维数组的每个元素都是一个一维数组,那整个数组就成了二维数组。
对于p[1][2]可以解析为:*(*(p+1)+2) ,再解析,*(p+1)操作使指针指向了第二个小数组的首地址并执行了*操作。
问题来了:p+1是地址,*(p+1)呢?
我们知道,如果定义一个普通的指针
int c=5;
int q=&c;
那么*q==c==5。对指针进行*操作就是取出指针所指向那片内存上的值。
在以上二维数组的代码中,加入以下代码进行测试:
printf("a[1]的地址是%p\n",*(p+1));
printf("a[1]的地址是%p\n",(p+1));
得到的结果是:p+1和*(p+1)都是地址,且数值相等。
p+1中p的步长是一个小数组的长度,即5×4个字节;而*(p+1)+1中,步长是一个元素的长度,即4个字节。
二维数组是数组的数组,a是大数组,a[0]、a[1]是小数组,p是大数组的指针,对小数组进行操作;*p是小数组的指针,对元素进行操作。
最后验证一下:
printf("a的地址=%p\n",*p);
printf("a的地址=%p\n",p);
运行结果都是地址,且数值相同,p和*p两者都是指针。
C语言初学者关于数组指针的深度讨论的更多相关文章
- C语言学习笔记--数组指针和指针数组
C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...
- C语言基础 (9) 数组指针
复习 只要把地址拿到就能这么操作.. (这里是合法的地址,不是野指针) 只有定义变量后,此变量的地址才是合法的地址 野指针就是保存没有意义地址的指针变量 操作野指针变量本身不会有任何问题 操作野指针所 ...
- go语言基础之数组指针做函数参数
1.数组指针做函数参数 示例: package main //必须有个main包 import "fmt" //p指向实现数组a,它是指向数组,它是数组指针 //*p代表指针所指向 ...
- 嵌入式-C语言基础:数组指针
定义一个数组指针,指向二维数组: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4];//定义二维指针数组 p=a;//指向二维数组 ...
- C语言二维数组指针与指针数组
http://c.biancheng.net/view/2022.html http://c.biancheng.net/view/2020.html
- C语言数组指针
C语言中的数组指针与指针数组: ·数组指针一.区分 首先我们需要了解什么是数组指针以及什么是指针数组,如下: int *p[5];int (*p)[5];数组指针的意思即为通过指针引用数组,p先和*结 ...
- C++语言中数组指针和指针数组彻底分析
################################# ## 基本知识 ## ...
- C语言深度剖析-----指针数组和数组指针的分析
指针数组和数组指针的分析 数组类型 定义数组类型 数组指针 这个不可能为数组指针,指向数组首元素 例 指针数组 例 main函数的参数 例 小结
- [CSDN转载]致C语言初学者—指针注意项
在论坛里经常见到一些新人对指针提出一些问题,作为一个经历过许多错误后的新手,我想把自己的经历说出来,避免让后来人继续这样的错误. 在讲解指针之前,需要理解一下内存空间.内存是随机存取器,计算机上 ...
随机推荐
- HTML之元素分类(HTML基础知识)
HTML之元素分类 一.按照块级元素还是行内元素分类 块级元素(block-level)和行内元素(inline-level,也叫作“内联”元素). a.块级元素(独占一行) 块级元素:其最明显的特征 ...
- spring boot maven打包可运行jar包
普通打包之后在程序目录运行,或者编写bat运行时会提示“没有主清单属性”,这是因为并没有找到main()方法,需要我们指明告诉java程序 我bat中的代码 @echo off title mytit ...
- Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
一.深入JVM锁机制:synchronized synrhronized关键字简洁.清晰.语义明确,因此即使有了Lock接口,使用的还是非常广泛.其应用层的语义是可以把任何一个非null对象作为&qu ...
- leetcode-13罗马字符转整数
leetcode-13罗马字符转整数 算法:转换的规律是先逐字符按照对应的阿拉伯数字累加,然后对于特殊的(I.X.C出现在左侧)要处理.处理方法:出现特殊字符组合减去双倍的左侧字符(在开始的处理中已经 ...
- ERP主副机和打印机配置FAQ
一.主副机 1. ERP主副机配置 先配置主机 再配置副机 在主机的电脑上键盘按win+R键,输入cmd 再输入ipconfig查看主机的IP 然后在副机上安装银盒子ERP,在红框位置输入主机IP 选 ...
- Linux中Root密码破解
1.开机后在选择菜单时按下e进入编辑模式 2.选择linux16这一行,在行末尾添加 rd.break 3.然后Ctrl+x执行.然后进入shell界面: 4.设置密码: 1.重新挂载根目录为读写模式 ...
- RMAN命令DELETE操作总结
本篇总结一下RMAN命令中的DELETE操作,DELETE命令用于删除RMAN备份记录以及相应的物理文件. To delete physical backups and copies as well ...
- ORACLE Index Lookup索引访问路径总结
在ORACLE中,索引访问/查找(Index Lookup)路径有五种方式,分别为INDEX UNIQUE SCAN.INDEX RANGE SCAN.INDEX FULL SCAN.INDEX FA ...
- Windows Server 2012更新补丁后导致Micosoft ODBC for Oracle出现问题
上周由于WannaCry勒索病毒肆虐全球,14号系统管理员更新了一系列补丁后,导致一Windows Server 2012服务器上面部署的一些老旧的应用无法使用Microsoft ODBC for O ...
- shell编程—简单的使用(二)
使用shell编辑.sh使其输出hello tynam 1.新建一个.sh文件,然后进行编辑 vi hello_tynam.sh 2.进行编辑,先按i键进行激活,然后输入echo hello tyna ...