现在的位置: 首页 > 综合 > 正文

[杂记521] c指针 聚类搜索引擎 excel图表x轴改刻度 协议栈 cve

2014年03月15日 ⁄ 综合 ⁄ 共 2607字 ⁄ 字号 评论关闭

一堆杂事忙了一个礼拜,什么都没干成,遇到了一些问题,特作记录。

1. 看linux的源代码才知道自己的c语言学的有多烂 只好重新花了一个下午的时间好好回忆了指针的常规用途。特写一个自己看的总结:

  • 严格的说指针就是地址,指针变量是表示这个地址的变量,不过两者通常不区分,通常说这个指针变量就是指针;
  • 普通类型的指针,如int *p, 这个p就可以指向一个int类型的变量,此处的*号只是为了定义p,说明它是一个指针。如int a=3; 那么p怎么指向a呢,很简单,取a的地址,牢记指针就是地址,p=&a。&就是取地址符,那么怎么得到p的值呢,那就用取值符号*,则int b=*p就表示b等于p指针指向的值,即为3.  让我们记住两个符号 【&】和【*】。(注意下面的各种特殊情况)
  • 当指针指向一个一维数组的时候,比如说int a[3]={1,2,3}. 那么int *p; p=a. 那么p指向的就是这个数组的首地址,所以a[0]=p[0],需要注意的是,和前面讲的区别,我们这里的p并没有加取值符,就可以得到实际的值,当然*p也可以得到第一个a[0]的值。同理:a[i]=p[i]=*(p+i)=*(a+1);  而且其地址也都是相同的:p=a=&a[0]。
  • 当指针指向一个二维或多维数组的时候,事情又变得更有趣。比如说int a[2][2]={11,12,21,22}。首先讨论其自身的指针问题(也就是没有创建新的指针变量的情况下),这个时候a就被拆开为a[0]和a[1]两个一维数组,而此时a[0]并非对应的某个值,它对应的是第一个一维数组的首地址,也就说它是个地址,而根据上面我们知道一维数组中,a[i]=*(a+i), 而这本身就是a的首地址,当然可以用&a表示,所以很奇怪的一个等式居然成立了: a[0]=*a=&a.  and a[1]=*(a+1)=&a[1]; 即:a[i]=*(a+i)=&a[i]。 可以发现:我们在前面一直区分的取值符号*和取地址符号&,在这里居然从某种意义上讲等价了,当然不是,我们要从意义上分析,这也只局限于当前这种环境,这里面只是列举了多种表示地址的方式而已。当然,地址有等式,值也有,在二维数组中,取值一般形式:a[0][1], (取第一个数组的第二个值的地址,就需要a[0]+1,或者*a+1,或者&(a[0][1]);)这里也等价于上面任何一个地址之前再加一个取值符号*,如:*(*a+1). 此时,如果一个数组指针变量p指向a,则:p=a;  a[0]=p[0]=*p, 可以推出:a[1][1]=*(*(p+1)+1), 即: a[i][j]=*(*(p+i)+j).  其中的括号非常有意思,(P+i)就表示以维度为级别推进,p是第一个数组,p+1就是第二个的了,而后面的*(P+1)+j中的j可就只能是列数推进了,只表示相见推进了j列。所以区分好很重要奥。必须必须指明的是:不是随便的p就可以指向这个二维数组的,它必须这样定义 int (*p) [2] ,两点注意:1: *p前后的括号不能少,2: [2]表示二维数组的列数。如果是int a[3][4], 则指向它的指针就应这样定义 int (*p)[4]. 明白了吧,其实这个指针就是一个一维数组类似形式的了。但是要知道,这不是指针数组,指针数组是不需要括号的。要注意区分。
  • 当指针指向字符串时,更特殊了。一般情况下: char a='q'; char *pa; pa=a; 则*pa就能取出值为'q'. 这是最一般的情况,运用最通用的*和&。但是,if : char *ps=" csdn", 那么这个时候ps就直接代表这个字符串的首地址,而且你甚至可以把这个ps当做其他语言中的string使用,比如你直接打印它: printf("%s",ps), 或者定义一个替换字符串,如char *pf="%s", 你就可以在printf中用pf代替这个"%s", 即: printf(pf,ps);  多么神奇啊!我居然没有使用取值符*,就代表了整个字符串!————当然这个时候,还要知道*ps仍代表这个字符串的首字符'c'。而且*(ps+1)会指向第二个字符's'。并由此衍生了一个nx的赋值语句,情景:if: char *pss="josay", *psd, a[10]; 且pad=a. 此时如果你想把pss的值付给psd,而且pad能够同时更新a,那么这是我见过的最令我记忆深刻的一个赋值函数(语句),这个函数里面的两个形参就是char *pss, char *psd. 然后就一句话:while(*psd++=*pss++).这里首先是while循环,然后是赋值*psd=*pss(就是第一个字符c).然后两个指针都向后移动。终止条件本来应该是判断最后一个值是'/0',但由于其ascii值刚好为0,随意直接拿其值判断了,oh, i cant believe,真是太牛了。再加上通过函数调用,不会让pss和psd的指向地址发生变化,但其psd指向地址的值却发生了变化,也就是数组a被赋值了。如果你直接使用  while(*psd++=*pss++).而不是把它写到一个函数中再调用,那么你需要把pss和psd都减去移动的次数,才能回到原来的地址指向。还要补充一点:psd就代表整个字符串csdn,那么psd+1可就输出为sdn。妙吧,想想c#我们想截断一个字符串还要引用函数写n个参数才ok啊。
  • 当指针指向结构时,一个新的符号产生了->。下回分解。

2. 帮一个兄弟看了一下聚类的搜索引擎,后来发现,靠,一直认为学术化的东东居然已经有了好多个可用的版本,中文的外文的都有,而且速度还都可以。不容易啊。推荐一个国内的看看:

http://www.seekxun.com/ 上海的team做的,还不错。国外的有好几个,不过忘了,改天再传上来。google刚才也没直接查到。

 

3. excel画图还是很easy的,柱状图如果x轴的刻度需要根据需要修改:如果是文字很简单,直接构造一个新的就可以了,如果是数字,则可以:1,把其修改为文字,比如加个单位之类,2,构建xy轴的坐标表示,只要y轴的刻度有一个文字,系统就会自动把左列的一行当y轴坐标,上面一行当做x轴坐标,即使那一行是数字。看不懂吧,呵呵,没事,我自己看的。

 

4.  写一个linux下的协议栈,奋斗中。基本上把协议的处理给搞定了,还有一些细节。

 

5. cve的漏洞分析还要一个大作业。omg!

 

6.  最近愈发。。。

抱歉!评论已关闭.