由协议栈源码想到的c和指针书籍

来源:互联网 发布:千牛mac官方版 编辑:程序博客网 时间:2024/05/22 17:12
        unsigned char *ptr;        struct tcphdr *th = tcp_hdr(skb);        int length = (th->doff * 4) - sizeof(struct tcphdr);        ptr = (unsigned char *)(th + 1);

最近看源代码的时候,发现了一个很经典的用法,

估计在C中经常使用,

就是:ptr = (unsigned char *)(th+1);

于是,做了一个实验,用数组测试,如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){      int a[] = {1,2,3,4,5};   int *t = a;   printf("sizeof a=%d\n",sizeof(a));   printf("a =%d\n",a);   printf("a+1 =%d\n",a+1);   printf("a+2 =%d\n",a+2);   printf("&a=%d\n",&a);   printf("&a+1=%d\n",&a+1);   printf("*a=%d\n",*a);   printf("*(a+1)=%d\n",*(a+1));   printf("*(&a-1)=%d\n",*(&a-1));   printf("*(&a+1)=%d\n",*(&a+1));   printf("sizeof t=%d\n",sizeof(t));   printf("t = %d\n",t);   printf("t+1 = %d\n",t+1);   printf("t+2 = %d\n",t+2);   printf("&t=%d\n",&t);   printf("&t+1=%d\n",&t+1);   printf("&t-1=%d\n",&t-1);   printf("*(&t-1)=%d\n",*(&t-1));   printf("*(&t+1)=%d\n",*(&t+1));   printf("&t+2=%d\n",&t+2);   printf("t=%d\n",*t);   printf("t+1=%d\n",*(t+1));   printf("a[0]= %d\n",&a[0]);   printf("a[1]= %d\n",&a[1]);   printf("a[2]= %d\n",&a[2]);   printf("a[3]= %d\n",&a[3]);   printf("a[4]= %d\n",&a[4]);   printf("a[5]= %d\n",&a[5]);   printf("a[6]= %d\n",&a[6]);} 

发现打印的结果如下,

sizeof a=20a =139503088a+1 =139503092a+2 =139503096&a=139503088&a+1=139503108*a=1*(a+1)=2*(&a-1)=139503068*(&a+1)=139503108sizeof t=8t = 139503088t+1 = 139503092t+2 = 139503096&t=139503152&t+1=139503160&t-1=139503144*(&t-1)=4195344*(&t+1)=0&t+2=139503168t=1t+1=2a[0]= 139503088a[1]= 139503092a[2]= 139503096a[3]= 139503100a[4]= 139503104a[5]= 139503108a[6]= 139503112

嗯,这样就比较清楚的了解指针和数组的关系了!

原创粉丝点击