最近几天呢,都在忙我的ls,不过还好今天终于完工了。。。
还是先总结下最近吧,就以倒叙写吧,发现以前讲座中的有些东西自己都不太清楚了,,不过现在超兴奋的,开始喽! 就拿今天讲的字符串与编码,有好多有趣的东西你可能没有发现哦,但是我们今天的讲座里提到了呢。
No.1、传值与传址
我个人觉得,这两者既有区别又有联系,区别就是一个传值一个传址;联系呢就是都是值嘛,一个变量本身的值,一个是变量地址的值。就拿一个简单的交换函数swap();解释下吧。
void swap(int a, int b)
{
int c;
c =a;
a = b;
b = c;
}
这就是一个典型的传值题型,当其他函数要调用的时候虽然完好的调用了,但是却不能真正交换变量本身的值。而下面这个却可以:
void swp(int *s1, int *s2)
{
int temp;
temp = *s1;
*s1 = *s2;
*s2 = temp;
}
这个也就是一个典型的传址问题,当其他函数调用时,传入的是地址,所以就轻而易举的改变了变量本身的的值。
还有一个问题就是半角字符,其实就是所谓的英文字符,eg: , . ' ' '' '' ! ?,其次呢就是全角字符,就是中文的标点符号啦,eg:, 。 ;?!等等这些,大家都知道在以前GBK编码就是中国汉字的编码。。。
No.2、关于字符串的种种这般~
先写几个常用的字符串方面函数的函数原型:
#include <string.h>
int strcmp(const char *dest, const char *str);
char *strcpy(char *dest , const char *str);
char *strcat(char *dest, const char *str);
这些字符串的链接,拷贝,比较啊神魔的都是可以自己去编写的,但我们编出来的大多要不就是效率差,要不就是考虑得不到位,如果是大数据的话我们这些根本就处理不了,所以还是先看看人家是怎末写的吧。(可以搜一下GNU版的strlen,可以看一下http://www.cnblogs.com/zhaoyl/archive/2012/09/18/2691214.html)
No.3、C语言代码对结构体的处理~
先看一个好玩的例子:
struct ab
{
int a;
int b;
};
int main()
{
struct ab array[2];
array[0].a = 1;
array[0].b = 2;
array[1].a = 3;
array[1].b = 4;
((struct ab*)(&(array[0].b)))->b = 0;
printf("%d ,%d ,%d, %d\n",array[0].a,array[0].b,array[1].a, array[1].b);
}
这个很好玩哦,先猜一下它的结果:1,2,0,4。可是这又是为神魔呢?
原因很简单:就是对array[0].b的地址强制转换了一下,然后array[0].a,array[0].b,的指向就会偏移,用一个图来解释吧
a b a b
1 | 2 | 3 | 4 |
图中的b'就是((struct ab *)(&(array[0].b)))->b <=> b',仅仅只是一个数组名和偏移量造成的这些,呵呵,如果不仔细想想自己也快晕了~~
还有一个好玩的:
#include <stdoi.h>
int main()
{
int a = 0;
char *p = (char *)&a;
p[0] = 0xff;
p[1] = 0xff;
p[2] = 0xff;
p[3] = 0xff;
printf("%d\n",a);
}
恩恩,聪明的你应该知道答案了吧? 没错,结果就是 : -1.
至于原理嘛,可以自己偷偷的想一下、、、
好啦,以上就是今天讲座学到的东西,虽然看起来不怎末深奥,但是细节问题还是不少哦~快乐的学习,学到的东西才会多嘛。
In my opinion,happy is very important !