数组下标还可以这样使用?

来源:互联网 发布:上海数据港 ipo 编辑:程序博客网 时间:2024/06/06 05:17

 先看看下面这段代码

#include<stdio.h>
int main(){
       unsigned char result = 1["night"]*2["girls"]+4["allnight"];
       char *of_you = "Though you was strong enough and seem never died";
       printf("You got %s", result+of_you);
       return 0;
}
请问打印的内容是什么?下面这段代码打印的内容又是什么呢?

#include<stdio.h>
int main(){
       unsigned char result = "night"[1]*"girls"[2]+"allnight"[4];
       char *of_you = "Though you was strong enough and seem never died";
       printf("You got %s", result+of_you);
       return 0;
}

 

分析:

数组元素的下标可以放在[]前面,而数组名放在[]中间
int a[10]={0,1,2,3,4,5,6,7,8,9};

a[0]与0[a]是一样的,都是0。

实际上,只要是形如 a[b] 形式的基本上都可以看成是数组, 其中a为基址,[] 里面的b 为偏移量, 数组里的元素就是靠index = base + offset 来索引(基址与偏移量都是值,没有差异,所以位置可以互换,index为内存地址),所以说上面的两段代码,都是这个特例,第一个元素都是基址,而第二个元素都是用[]扩起,那么它就是偏移量,只是常量字符串它的值为他的首地址,地址也是一个值(c语言是只是传值),所以进一步推广,这里的a、b 可以是求值表达式,那么上述两个例子的行为就在情理之中了。

下面再给出 linux/fs/namei.c 中的一个例子 :
#define ACC_MODE(x) ("/004/002/006/377"[(x)&O_ACCMODE])
这个宏 ""里面的就是一个四个元素的字符串,他就是基址,后面[]里面的求值表达式即为偏移量,他可以看成一个广义数组, 所以就可以根据[]的偏移量索引基址所在地址的值。从这里可以进一步看出,只要你能够以某种方式给出内存的地址,那么那个地址的值就能够访问,形如 a[b] 的数组的功能,就是访问给定地址单元的值。如果能从汇编语言的角度考虑就更好理解了, 即:如果你要访问某个元素,你首先要知道这个元素所在的内存地址,数组的功能就是找到这个地址(自动把基址与偏移量相加)。

 

所以 ,1["night"]就是*("night"+1),也就是'i',ascii码为105
类似,2["girls"]是'l'(114)
4["allnight"]是'i'(105)
result=(105*114+105)%256=43
result+of_you=43+"Though you was strong enough and seem never died"
指向第43个字符开始的字符串。



 

原创粉丝点击