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语言初学者—指针注意项
在论坛里经常见到一些新人对指针提出一些问题,作为一个经历过许多错误后的新手,我想把自己的经历说出来,避免让后来人继续这样的错误. 在讲解指针之前,需要理解一下内存空间.内存是随机存取器,计算机上 ...
随机推荐
- HDU 2586 How far away ?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...
- 25.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1)
查看Odoo产品分析系列--目录 工资表不在"应用"中,在搜索该模块时需要将默认的"应用"过滤删除掉. 安装工资表后,出现工资单菜单: 1. 薪资规则类别 ...
- iOS---------- MBProgressHUD (1.0.0)的变动
1.改变菊花的颜色 // hud.color = [UIColor blackColor];--------------> hud.bezelView.color =[UIColor b ...
- Android智能指针SP WP使用方法介绍
Android手机操作系统既然是开源的操作系统.那么在具体的文件夹中就会存放着各种相关功能的开源代码.我们在使用的时候可以根据这些源代码进行相应的修改就能轻松的完成我们所需的功能.在这里大家就一起来看 ...
- apk公钥私钥用法
每个密钥都包含两个文件:一个是扩展名为 .x509.pem 的证书,另一个是扩展名为 .pk8 的私钥.私钥需要加以保密,并用于对 apk 包进行签名.密钥本身也可能受密码保护.相比之下,证书只包含公 ...
- vue自定义一个v-model
目标 js <template> <my-form v-model="form"> </my-form> </template> & ...
- 大约当你拿捏的准世事的分寸时,你便会成功了。(NULL)
(网络盗图)
- python3中list列表的一些操作
最近遇到许多List的操作,感觉它是一种很重要的一种基础数据结构,本人掌握的也不是很扎实,这里找了一些列表的操作,常用函数,记录下来,希望对大家有用.如果理解有偏差,欢迎指正,感谢! (1)列表的合并 ...
- MySQL注入与防御
1.简介 1.1.含义 在一个应用中,数据的安全无疑是最重要的.数据的最终归宿都是数据库,因此如何保证数据库不被恶意攻击者入侵是一项重要且严肃的问题! SQL注入作为一种很流行的攻击手段,一直以来都受 ...