博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二维数组和指针的一些感悟
阅读量:4111 次
发布时间:2019-05-25

本文共 2047 字,大约阅读时间需要 6 分钟。

编译器: VC++6.0 win32 platform program
数组和指针:
(一)一维数组和指针
int a[2] = {0x12345678 , 90};
int *p;
p = a
首先 p 指向 a,因为数组的名字就是指针,而且类型是 int 所以这里简单的匹配了。
那么
*p == a[0] == 0x12345678
*(p+1) = a[1] = 90;
注意指针地址加一这个操作,关键是看指针的类型,现在这里指针既然是指向了int数组
那么里面元素的类型也应该是 int,所以 p+1 这个操作应该是移动了一个 int 。
于是一种比较常用的处理手段出现了。
a[0] 元素是 int 型,4个字节,那么我怎么访问里面的每一个字节呢?
那么可以通过
*((char *)p + 1)
这里有两个括号,优先级规则当然是里面的括号最优先,首先将 p 的类型是 int * 强制
转换为 char * ,那么现在类型边了, p+1 访问的应该是原来的指针地址移动一个字节!
注意是字节。
0x12345678 这个数字,应该指向 0x56 ,因为PC是little endian小端格式,低字节先存放
得到的结果就能很好的解释了。
(二)二维数组和指针
(1)地址代表的意义
首先理解,二维数组,例如
int arry[2][3]={
{2,3,1},
         {23,45,6}};
这样写是最好理解的,也就是说2行3列。其中也可以看成是2个一维数组的整合,也就是
arry[0] = {2,3,1};
arry[1] = {23,45,6};
简单测试一下一些符号究竟代表的是什么意思
 printf("\n%x",arry);
 printf("\n%x",arry[0]);
 printf("\n%x",&arry[0][0]);
 printf("\n%x",arry+1);
 printf("\n%x",arry[1]+1);
 printf("\n%x",&arry[1][1]+1);
从编译运行的结果来看
12ff68
12ff68
12ff68
12ff74
12ff78
12ff7c
arry 是这个数组的名字,也就是代表着入口地址,刚才说了,二维数组实际可以看成N个
一维数组,例如本例中,arry[0] 代表着其中的第一个一维数组,那么 arry[1] 就代表着
第二个一维数组,而且这里是地址,注意 arry[0] 本身就代表着地址了。
arry[0][0]本身代表着这个元素,那么取地址之后 &arry[0][0] 就变成了,这个元素的地址
然而将每个地址加一后发现,这些地址代表的语义并不相同。
arry+1 之后地址变成 12ff68 到 12ff74 也就是说,指向了 第二行第一个元素 23
arry[1]本身就代表着第二个一维数组的入口地址,加一之后就只想这个数组的第二个元素
那么就应该指向 45,从地址可以看出。
&arry[1][1]+1 这个是以元素为单位,首先 arry[1][1]这个元素为基准,也就是 45 ,然后
再后移一个元素,所以应该指向 6.
参考
(2)二维数组怎么传递参数
void disparry(int a[2][3])
{
 printf("\n%d,%d,%d",a[0][0],a[0][1],a[0][2]);
}
void main(void)
{
 int arry[2][3]={
{2,3,1},
 {23,45,6}};
 int (*c)[3]=arry;
        int *p;
 p =(int *)arry;
 disparry((int (*)[3])p);
 disparry(c);
}
可以通过两种办法,第一是通过 int * 类型的指针 *p 来处理。首先因为 p 是 int* 类型,
而 arry是二维数组,不等价不能直接赋值,那么就简单的将二维数组指针转换为 int* 类型
这样就匹配了,产生的效果是 p 指向了 arry 的入口。
然后 disparry 函数需要的参数的类型是 int a[2][3],很显然,这个时候 p又不能作为参数
了,当然直接传递的话,运行结果不错,但是会有 warning 的。于是再一次将 int * 转换为
需要的 int (*)[3] 类型,说白了,就是 数组指针。
那么第二种办法就很干脆,定义一个数组指针c指向 arry,那么 c就可以直接传递了。
(3)使用 typedef 定义二维数组
        typedef int A[2];
 A b[3]={32,11,23,45,6,7};
 printf("\n%d",b[1][0]);
可以看出,先定义一种新的数据类型 A,他是一个 2个元素的一维数组。然后再定义一个含有
3个 A 类型的一维数组b,这样b其实就是一个二维数组了,b[3]代表的是有3行这样的一维数组
所以这样下来实际上等效于 b[3][2]。

转载地址:http://pqosi.baihongyu.com/

你可能感兴趣的文章
hadoop-2.2.0多个队列资源分配
查看>>
php get post 发送与接收
查看>>
Linux C 字符串函数 sprintf()、snprintf() 详解
查看>>
PHP采集curl应用的一点小疑惑
查看>>
第一章 C++编程基础
查看>>
Node.js开发笔记Windows篇(二)安装Express
查看>>
[LOJ 6213]「美团 CodeM 决赛」radar
查看>>
解决gridview row 左边序列号 显示不完全的技巧
查看>>
solr和es的区别
查看>>
css中的相对定位和绝对定位
查看>>
Bodymovin:Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画
查看>>
Tomcat7启动报Error listenerStart错误
查看>>
spring源码学习之springMVC(二)
查看>>
ChannelPipeline
查看>>
Go语言备忘录(2):反射的原理与使用详解
查看>>
公有属性 公有方法(原型方法) 私有属性 私有方法 特权方法 静态属性 静态方法 对象字面量创建...
查看>>
spring(一) IOC讲解
查看>>
SpringBoot+WebSocket
查看>>
基本数据类型,string类型的瞎扯,final喜欢干的事儿。final string
查看>>
PAT乙级1011
查看>>