int ints[20] = {10,20,30,40,50,60,70,80,90,100,
110,120,130,140,150,160,170,180,190,200};
int *ip = ints + 3;
//假定ints数组在内存中的起始位置是100 , 整型值和指针的长度都是4个字节
表达式 | 值 | 表达式 | 值 |
---|---|---|---|
ints | 100 | ip | 112 |
ints[4] | 50 | ip[4] | 80 |
ints + 4 | 116 | ip + 4 | 128 |
*ints + 4 | 14 | *ip + 4 | 44 |
*(ints + 4) | 50 | *(ip + 4) | 80 |
ints[-2] | 非法 | ip[-2] | 20 |
&ints | 100 | &ip | 非法 |
&ints[4] | 116 | &ip[4] | 128 |
&ints + 4 | 420 | &ip + 4 | 非法 |
&ints[-2] | 非法 | &ip[-2] | 104 |
ints 和 &ints的值为什么一样
这两个看的角度不一样.
(1)ints是指针常量 , 即数组首元素ints[0]的地址 .
(2)&ints是整个ints[20]的首地址 , 是以整个数组为角度来看 , 虽然它与ints[0]的值相同 , 但是&ints+1就已经增加了20个int类型的字节的长度了.
注 : arr[1] === *( arr + (1) )
2[arr] 是合法的 , ==> *(2 + (arr) ) ==> *(arr +2)
brrr[3][10] , brr名字的值是一个指向它第一个元素的指针 , brr是指向一个包含10个元素的数组的指针
二维数组得到具体值需要解两次引用 , 第一次确定行 , 第二次确定值(列)
多维数组作为函数参数 :
void func(int (*mat)[10]);
void func(int mat[] [10])
mat的第一个下标根据包含10个元素的整型数组的长度进行调整 , 接着第二个下标根据整型的长度进行调整.
关键在于编辑器必须知道第二个以及后各维的长度才能对各下标进行求值 , 因此在原型中必须声明这些维的长度 ; 第一维的长度并不需要 , 因为在计算下标值时用不到它