关于指针数组和数组指针的浅谈

来源:互联网 发布:数控车编程培训 编辑:程序博客网 时间:2024/06/12 23:45

在实际的code情况下,非常容易对数组指针和指针数组进行混淆,现对此进行稍微的归纳整理:

我们会经常会见到这样的指针形式:

1)int *a[10];

2) int (*a)[10];

碰到这两个形式,首先会感觉手忙脚乱的,不知道从哪儿入手。

首先说一下优先级:

()>[]>*'

()的优先级最高,[]其次,*的优先级在三者之中最低。

因此,对于1)[]优先级最高,先进行它的计算,所以a是一维数组,其里面的参数类型是int*,也就是说,数组里的每个参数都是int*型,这谓之指针数组。

对于2,先进性()的计算,所以a是一个指针,指向一个整型数组的地址。这个数组的长度是10,因此如果进行a++的计算,其步长为10。这谓之数组指针。

因此,综上所述,数组指针是一个指针变量,只占四个字节,可用于表示二维数组的地址。而指针数组,可以表示多个指针变量,占有很多的存储空间。


再来讨论a和&a的区别:

#include <iostream>using namespace std;int main(){char a[5] = {'A','B','C','D'};char (*p3)[5] = &a;//下行在有些编译器下报错//char (*p4)[5] = a;p3++;char* c = p3[-1];printf("%s\n",p3[-1]);return 0;}
&a:表示数组的首地址。

a:表示数组第一个元素的首地址。

上述代码解释:

p3++;//p3的步长是5,使地址前进5个字节。


再来介绍一下指针强制转换出现的一种现象:

先看下面这个例子:
struct Test
{
   int Num;
   char *pcName;
   short sDate;
   char cha[2];
   short sBa[4];
}*p;

假设p 的值为0x100000。如下表表达式的值分别为多少?
   p + 0x1 = 0x___ ?
   (unsigned long)p + 0x1 = 0x___?
   (unsigned int*)p + 0x1 = 0x___?
1)步长为整个结构体的变量,为20个自己,所以答案是0x100014;

2)  将p强制转换,成为一个无符号长整型,直接加1即可。答案为0x100001;

3)将p强制转换为无符号int*,使步长为4个字节,所以答案为0x100004;

0 0
原创粉丝点击