指针数组与数组指针

来源:互联网 发布:mac os ps 破解版 编辑:程序博客网 时间:2024/06/03 17:34


指针数组与数组指针

首先我是个渣渣,本文仅限参考

1、首先先分清指针数组和数组指针的区别:

指针数组;首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。

数组指针:首先它是一个指针,它指向一个数组。在32位系统下永远占4个字节,至于它指向的数组占几个字节,我们并不知道。它是“指向数组的指针”的简称。

2、下面来说明指针数组与数组指针的表达:

那么下面两种表达方式哪个是数组指针哪个是指针数组呢?

1) int *p1[10]

2 )  int  (*p2)[10]

在这里我们知道“[]”的优先级比“*”高,p1先与[]结合构成一个数组,构成一个数组,再用int*来修饰,所以这个数组中有十个int类型的指针,叫做指针数组。 

对于p2就更好理解了,()的优先级高,int修饰的是数组内容,这种类型叫做数组指针。

3、下面再来讨论a和&a的区别

先看下面的一段代码;

int main(){char a[5]={'A','B','C','D'};char(*P3)[5]=&a;char(*p4)[5]=a;return 0;}

这里&a表示的是整个数组的首地址,a表示首元素的首地址,虽然表示的值相同,但p4左右两边的数据类型不一样,编译器会给出警告,虽然运行并没有问题,但是要少用。

4、下面来介绍地址的强制转换

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___?

p+0x1的值为0x100000+sizeof(Test)*0x1.至于此结构体大小为20比特位,所以p+0x1=0x100000+20=0x100014;

(unsigned long)强制转化p为无符号长整型整数,所以这里就是加上整数0x1了,所以(unsigned long) p+0x1=0x100000+0x1=0x100001;

(unsigned int*)强制转化p为无符号整型指针,所以它的值为0x100000+sizeof(unsigned int)*0x1=0x100000+0x4=0x100004.

分析完毕,我只了解这些

3 0
原创粉丝点击