首先讨论:
a为数组名。sizeof(a)和sizeof(&a)有什么区别?结果是?
sizeof(a) 求的是 数组的空间大小。
sizeof(&a),此时&a指的是一个指针,而指针的大小也是4
#include <stdio.h>
int main()
{
int a[20];
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(&a) = %d\n",sizeof(&a));
return 0;
}
解释:
sizeof(a) 求的是 数组的空间大小 即 20 * 4 (int形大小)= 80
sizeof(&a),此时&a指的就是一个指向int型数据的指针,而指针的大小也是4,所以sizeof(&a) = 4
int a[5]={1,2,3,4,5}
假设起始地址是0x2000 0000
地址 | 数值 |
---|---|
0x2000 0000 | 1 |
0x2000 0001 | 0 |
0x2000 0002 | 0 |
0x2000 0003 | 0 |
0x2000 0004 | 2 |
0x2000 0005 | 0 |
0x2000 0006 | 0 |
0x2000 0007 | 0 |
0x2000 0008 | 3 |
0x2000 0009 | 0 |
0x2000 000A | 0 |
0x2000 000B | 0 |
0x2000 000C | 4 |
0x2000 000D | 0 |
0x2000 000E | 0 |
0x2000 000F | 0 |
0x2000 0010 | 5 |
0x2000 0011 | 0 |
0x2000 0012 | 0 |
0x2000 0013 | 0 |
b=( u32) 0x2000 0000
a
&a
三个值从数值来看相等,
( b + 1) = *0x2000 0001 =0
( &a + 1 ) = ( &a[0] +sizeof(int) )=0x2000 0004 =2
( a + 1 ) = * ( &a[0] +5sizeof(int) ) =0x2000 0014= 已经越界
结论:
在使用地址 +1 一定要小心。
b 是一个u32 的数值,+1 是没问题的
a 理论上不能作为左值来运算,编译器一般当作 a 指向数组 数组的空间大小 即 5 * 4 (int形大小)= 20
&a指的就是一个指向int型数据的指针,而指针的大小也是4,所以sizeof(&a) = 4
a,&a 本质来说是 地址指针 ,b是地址的数值 所以 b+1 是没问题的
a+1 则等于 a+ sizeof(a)
&a+1 则等于 a+sizeof(int )
int *p;
int (*q)[5] ;
int a[5]={0};
int b[5]={0};
p=a;
q=&a;
b[0]=p[0];
b[1]=*q[1];