2010年5月20日星期四

指针

指针的类型

指针所指向的类型

指针的值

指针本身所占据的内存区

int*ptr;

int *

int

sizeof( int *)=4

Sizeof(int*) = 4

char*ptr;

char *

char

sizeof(char*)=1

Sizeof(char*) = 4

int**ptr;

int **

int*

sizeof(int**)=4

Sizeof(int**) = 4

int*ptr[2];

int*[2]

int[2]

sizeof(int*[2])=8

Sizeof(int*[3]) = 4

int(*ptr)[3];

int(*)[3]

int()[3]

sizeof(int(*)[3])=12

Sizeof(int(*)[3]) = 4

char(*ptr)[3];

char(*)[3]

char()[3]

sizeof(char(*)[3])=3

Sizeof(char(*)[3]) = 4

int*(*ptr)[4];

int*(*)[4]

int*()[4]

sizeof(int*(*)[4])=16

Sizeof(int*(*)[4]) = 4


指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
  先声明几个指针放着做例子:
  例一:
  (1)int*ptr;
  (2)char*ptr;
  (3)int**ptr;
  (4)int(*ptr)[3];
  (5)int*(*ptr)[4];
  
  指针的类型
  从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
  (1)int*ptr;//指针的类型是int*
  (2)char*ptr;//指针的类型是char*
  (3)int**ptr;//指针的类型是int**
  (4)int(*ptr)[3];//指针的类型是int(*)[3]
  (5)int*(*ptr)[4];//指针的类型是int*(*)[4]
  怎么样?找出指针的类型的方法是不是很简单?
  指针所指向的类型
  当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
  从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
  (1)int*ptr;//指针所指向的类型是int
  (2)char*ptr;//指针所指向的的类型是char
  (3)int**ptr;//指针所指向的的类型是int*
  (4)int(*ptr)[3];//指针所指向的的类型是int()[3]
  (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
  在指针的算术运算中,指针所指向的类型有很大的作用。
  指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的 "类型 "这个概念分成 "指针的类型 "和 "指针所指向的类型 "两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。
指针的值,或者叫指针所指向的内存区或地址
  指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
  指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
  以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?
  指针本身所占据的内存区
  指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。
  指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
  指针的算术运算
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:
  例二:
  1、chara[20];
  2、int*ptr=a;
  ...
 ...
  3、ptr++;
  在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。
由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。
  我们可以用一个指针和一个循环来遍历一个数组,看例子:
  例三:
intarray[20];
int*ptr=array;
...
//
此处略去为整型数组赋值的代码。
...
for(i=0;i <20;i++)>
{
 (*ptr)++;
 ptr++;
}
  这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。

  再看例子:

  例四:

  1、chara[20];
  2、int*ptr=a;
  ...
  ...
  3、ptr+=5;
  在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。
  总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
  一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
运算符&和*
这里&是取地址运算符,*是...书上叫做 "间接运算符 "。
  &a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。
  *p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。
  例五:
inta=12;
intb;
int*p;
int**ptr;
p=&a;
//&a
的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。
*p=24;
//*p
的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。
ptr=&p;
//&p
的结果是个指针,该指针的类型是p的类型加个*,在这里是int **。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。
*ptr=&b;
//*ptr
是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。
**ptr=34;
//*ptr
的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。
  指针表达式
一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表式。
  下面是一些指针表达式的例子:
  例六:
inta,b;
intarray[10];
int*pa;
pa=&a;//&a
是一个指针表达式。
int**ptr=&pa;//&pa
也是一个指针表达式。
*ptr=&b;//*ptr
和&b都是指针表达式。
pa=array;
pa++;//
这也是指针表达式。
例七:
char*arr[20];
char**parr=arr;//
如果把arr看作指针的话,arr也是指针表达式
char*str;
str=*parr;//*parr
是指针表达式
str=*(parr+1);//*(parr+1)
是指针表达式
str=*(parr+2);//*(parr+2)
是指针表达式
  由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

  好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。
  在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。
  数组和指针的关系
  数组的数组名其实可以看作一个指针。看下例:
  例八:
intarray[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//
也可写成:value=*array;
value=array[3];//
也可写成:value=*(array+3);
value=array[4];//
也可写成:value=*(array+4);
上例中,一般而言数组名array代表数组本身,类型是int[10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int*,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

  例九:
char*str[3]={
  "Hello,thisisasample! ",
  "Hi,goodmorning. ",
  "Helloworld "
};
chars[80]
;
strcpy(s,str[0]);//
也可写成strcpy(s,*str);
strcpy(s,str[1]);//
也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//
也可写成strcpy(s,*(str+2));
上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char*。
*str
也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串 "Hello,thisisasample! "的第一个字符的地址,即 'H '的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char*。

  *(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向 "Hi,goodmorning. "的第一个字符 'H ',等等。

  下面总结一下数组的数组名的问题。声明了一个数组TYPEarray[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。
  在不同的表达式中数组名array可以扮演不同的角色。
  在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。
在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。
  表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。
例十
intarray[10];
int(*ptr)[10];
ptr=&array;
:
上例中ptr是一个指针,它的类型是int(*)[10],他指向的类型是int[10] ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

  本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:
int(*ptr)[10];
  则在32位程序中,有:
sizeof(int(*)[10])==4
sizeof(int[10])==40
sizeof(ptr)==4
实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。
指针和结构类型的关系
可以声明一个指向结构类型对象的指针。
  例十一:
structMyStruct
{
 inta;
 intb;
 intc;
}
MyStructss={20,30,40};
//
声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct*ptr=&ss;
//
声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。
int*pstr=(int*)&ss;
//
声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。
  请问怎样通过指针ptr来访问ss的三个成员变量?
  答案:
ptr-> a;
ptr-> b;
ptr-> c;
  又请问怎样通过指针pstr来访问ss的三个成员变量?
  答案:
*pstr
;//访问了ss的成员a。
*(pstr+1);//
访问了ss的成员b。
*(pstr+2)//
访问了ss的成员c。
  虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:
  例十二:
intarray[3]={35,56,37};
int*pa=array;
  通过指针pa访问数组array的三个单元的方法是:
*pa;//
访问了第0号单元
*(pa+1);//
访问了第1号单元
*(pa+2);//
访问了第2号单元

从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。
  所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个 "填充字节 ",这就导致各个成员之间可能会有若干个字节的空隙。
  所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。
过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。
  指针和函数的关系
  可以把一个指针声明成为一个指向函数的指针。intfun1(char*,int);
int(*pfun1)(char*,int);
pfun1=fun1;
....
....
inta=(*pfun1)( "abcdefg ",7);//
通过函数指针调用函数。
可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。
  例十三:
intfun(char*);
inta;
charstr[]= "abcdefghijklmn ";
a=fun(str);
...
...
intfun(char*s)
{
intnum=0;
for(inti=0;i{
num+=*s;s++;
}
returnnum;
}
  这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。
指针类型转换
当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。
  例十四:
  1、floatf=12.3;
  2、float*fptr=&f;
  3、int*p;
   在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的语句吗?

  p=&f;

  不对。因为指针p的类型是int*,它指向的类型是int。表达式&f的结果是一个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的方法是不行的。至少在我的MSVC++6.0上,对指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进行 "强制类型转换 ":
p=(int*)&f;
如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*TYPE, 那么语法格式是:
  (TYPE*)p;
  这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。
  一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。
  例十五:
voidfun(char*);
inta=125,b;
fun((char*)&a);
...
...
voidfun(char*s)
{
charc;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
}
注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int。形参这个指针的类型是char*,它指向的类型是char。这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp, 然后执行temp=(char*)&a,最后再把temp的值传递给s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。

  我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:
unsignedinta;
TYPE*ptr;//TYPE
是int,char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//
我们的目的是要使指针ptr指向地址20345686(十进制
)
ptr=a;//
我们的目的是要使指针ptr指向地址20345686(十进制)
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:
unsignedinta;
TYPE*ptr;//TYPE
是int,char或结构类型等等类型。
...
...
a=
某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a
;//呵呵,这就可以了。
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。

  想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完 全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:
  例十六:
inta=123,b;
int*ptr=&a;
char*str;
b=(int)ptr;//
把指针ptr的值当作一个整数取出来。
str=(char*)b;//
把这个整数的值当作一个地址赋给指针str。
  现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。
  指针的安全问题
看下面的例子:
  例十七:
chars= 'a ';
int*ptr;
ptr=(int*)&s;
*ptr=1298
;
  指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。
  让我们再来看一例:
  例十八:
  1、chara;
  2、int*ptr=&a;
  ...
  ...
  3、ptr++;
  4、*ptr=115;
  该例子完全可以通过编译,并能执行。但是看到没有?第3句对指针ptr进行自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代码。而第4句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。
  在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一想,应该会明白的。


http://embedfans.com/C/2007181016375897.htm

typedef struct 于 struct 的用法于区别

/**********初级篇**********/
1 首先:

在C中定义一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1;来声明
这里的Stu实际上就是struct Student的别名。
另外这里也可以不写Student(于是也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;
但在c++里很简单,直接
struct Student
{
int a;
};
于是就定义了结构体类型Student,声明变量时直接Student stu2;
===========================================
2其次:
在c++中如果用typedef的话,又会造成区别:
struct Student
{
int a;
}stu1;//stu1是一个变量
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型
使用时可以直接访问stu1.a
但是stu2则必须先 stu2 s2;
然后 s2.a=10;
===========================================
3 掌握上面两条就可以了,不过最后我们探讨个没多大关系的问题
如果在c程序中我们写:
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;
这算什么呢?
我个人观察编译器(VC6)的理解,这相当于
typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;
也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。

/*************提升篇***************/

1. 基本解释

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。

2. typedef & 结构的问题

当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;

答案与分析:

1、typedef的最简单使用

typedef long byte_4;

给已知数据类型long起个新名字,叫byte_4。

2、 typedef与结构结合使用

typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;

这语句实际上完成两个操作:

1) 定义一个新的结构类型

struct tagMyStruct
{
 int iNum;
 long lLength;
};

分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

2) typedef为这个新的结构起了一个名字,叫MyStruct。

typedef struct tagMyStruct MyStruct;

因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

答案与分析

C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。

根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

解决这个问题的方法有多种:

1)、

typedef struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;

2)、

typedef struct tagNode *pNode;
struct tagNode
{
 char *pItem;
 pNode pNext;
};

注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

3)、规范做法:

typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );

这个以前没有看到过,个人认为是宇定义一个uint32的指针函数,uint16*, uint32 为函数里的两个参数; 应该相当于#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );

struct在代码中常见两种形式:
struct A
{
//...
};

struct
{
//...
} A;
这其实是两个完全不同的用法:
前者叫做“结构体类型定义”,意思是:定义{}中的结构为一个名称是“A”的结构体。
这种用法在typedef中一般是:
typedef struct tagA //故意给一个不同的名字,作为结构体的实名
{
//...
} A; //结构体的别名。

后者是结构体变量定义,意思是:以{}中的结构,定义一个名称为"A"的变量。这里的结构体称为匿名结构体,是无法被直接引用的。
也可以通过typedef为匿名结构体创建一个别名,从而使得它可以被引用:
typedef struct
{
//...
} A; //定义匿名结构体的别名为A

第二篇:在C和C++中struct和typedef struct的区别

在C和C++有三种定义结构的方法。

typedef struct {

int data;

int text;

} S1;

//这种方法可以在c或者c++中定义一个S1结构

struct S2 {

int data;

int text;

};

// 这种定义方式只能在C++中使用,而如果用在C中,那么编译器会报错

struct {

int data;

int text;

} S3;

这种方法并没有定义一个结构,而是定义了一个s3的结构变量,编译器会为s3内存。

void main()

{

S1 mine1;// OK ,S1 是一个类型

S2 mine2;// OK,S2 是一个类型

S3 mine3;// OK,S3 不是一个类型

S1.data = 5;// ERRORS1 是一个类型

S2.data = 5;// ERRORS2 是一个类型

S3.data = 5;// OKS3是一个变量

}

另外,对与在结构中定义结构本身的变量也有几种写法

struct S6 {

S6* ptr;

};

// 这种写法只能在C++中使用

typedef struct {

S7* ptr;

} S7;

// 这是一种在C和C++中都是错误的定义

如果在C中,我们可以使用这样一个“曲线救国的方法“

typedef struct tagS8{

tagS8 * ptr;

} S8;

第三篇:struct和typedef struct

分三块来讲述:
1 首先:
在C中定义一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1;来声明
这里的Stu实际上就是struct Student的别名。
另外这里也可以不写Student(于是也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;
但在c++里很简单,直接
struct Student
{
int a;
};
于是就定义了结构体类型Student,声明变量时直接Student stu2;
===========================================
2其次:
在c++中如果用typedef的话,又会造成区别:
struct Student
{
int a;
}stu1;//stu1是一个变量
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型
使用时可以直接访问stu1.a
但是stu2则必须先 stu2 s2;
然后 s2.a=10;
===========================================
3 掌握上面两条就可以了,不过最后我们探讨个没多大关系的问题
如果在c程序中我们写:
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;
这算什么呢?
我个人观察编译器(VC6)的理解,这相当于
typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;
也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。

第四篇:C/C++中typedef struct和struct的用法

struct _x1 { ...}x1; 和 typedef struct _x2{ ...} x2; 有什么不同?

其实, 前者是定义了类_x1和_x1的对象实例x1, 后者是定义了类_x2和_x2的类别名x2 ,

所以它们在使用过程中是有取别的.请看实例1.

[知识点]

结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对其定义。

定义结构变量的一般格式为:

struct 结构名

{

类型 变量名;

类型 变量名;

...

} 结构变量;

结构名是结构的标识符不是变量名。

另一种常用格式为:

typedef struct 结构名

{

类型 变量名;

类型 变量名;

...

} 结构别名;

另外注意: 在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。

======================================================================

实例1: struct.cpp

#include

using namespace std;

typedef struct _point{

int x;

int y;

}point; //定义类,给类一个别名

struct _hello{

int x,y;

} hello; //同时定义类和对象

int main()

{

point pt1;

pt1.x = 2;

pt1.y = 5;

cout<< "ptpt1.x=" << y=" <
//hello pt2;

//pt2.x = 8;

//pt2.y =10;

//cout<<"pt2pt2.x="<< y="<
//上面的hello pt2;这一行编译将不能通过. 为什么?

//因为hello是被定义了的对象实例了.

//正确做法如下: 用hello.x和hello.y

hello.x = 8;

hello.y = 10;

cout<< "hellohello.x=" << y=" <
return 0;

}

第五篇:问答

Q:用struct和typedef struct 定义一个结构体有什么区别?为什么会有两种方式呢?

struct Student
{
int a;
} stu;
typedef struct Student2
{
int a;
}stu2;

A:

事实上,这个东西是从C语言中遗留过来的,typedef可以定义新的复合类型或给现有类型起一个别名,在C语言中,如果你使用
struct xxx
{
}; 的方法,使用时就必须用 struct xxx var 来声明变量,而使用
typedef struct
{
}的方法 就可以写为 xxx var;
不过在C++中已经没有这回事了,无论你用哪一种写法都可以使用第二种方式声明变量,这个应该算是C语言的糟粕。

冷笑话

1.老婆是刘德华德fans。某晚,跟老婆坐在床上看艺术人生,朱军采访刘德华,最后刘总结04年的感想,四个字:“活在当下”。我一愣,说:“活在裆下,那不是小弟弟吗?”后被老婆大骂。

2.吃晚饭。上播天气预报,上海“阴到多云”。听了千遍的词儿了忽然觉得不对劲儿,问老婆电视上刚才说什么,老婆说“阴到多云”,然后我就盯着老婆看,相视五秒,被老婆起身暴打。

3.结婚三年,还没买上房子。跟老婆达成共识,苦自己,不能苦孩子,所以一直没培育下一代。两个人也经常拿这事儿开玩笑。

某日看完汉武大帝,偶正情绪激动,说“如果有十万铁骑,我也可以打掉一只鞋(注:伊稚斜)”。老婆白了我一眼,说了一句差点让我抱头痛哭的话:“切~~,每次你都派出一亿兵马,还不是全军覆没”。

4.和老婆的开心时刻也很多。
有次她送我一个毛绒玩具――小哈巴狗,爬在地上的姿势。
开玩笑地对我说:“这个是你吧?”。
我看了很不服气,把它接过来,翻了个,让它仰卧的姿势。
然后很怪异地对她说:“这个是你吧?”。
希望你们能看懂。呵呵!

5.养蝌蚪
偶睡觉的时候喜欢平躺着把腿弯向两侧,往往会占很大的床铺面积,于是老婆很不满,问:你为什么睡觉像只蛤蟆?我答:养蝌蚪啊。

6.下班晚了,买了包水饺回家,吃饭的时候想起了白天在天涯看到的饺子的故事,就讲给老婆听:
两个饺子结婚,洞房花烛夜,公饺子送走客人关上房门,回头一看下了一跳,发现一个肉丸子躺在床上,公饺子问:我老婆呢?肉丸子骂道:笨蛋,人家脱了衣服你就不认识了。 听罢,老婆将一口饺子汤准确无误地喷了我一身。
晚上看了会儿电视我例行打开电脑玩一把游戏,正玩得起兴,听到老婆召唤,回头一看吓了一跳,忙做惊讶状问道:我老婆呢?
老婆骂道:你这个笨蛋......

7.用词不当

下班回家需要跟老婆坐同一趟车,但因为上下班时间不一样,所以不会赶在一起。
但就有这么一回,上了车发现老婆也在上面。看到我上来,老婆开心的不得了。下了车牵了她的手走回家的路上,老婆还在感慨:真好,晚上在一起,下了班还能一起回家,这就叫双宿双飞。。。
为了配合老婆的兴致,我也随声附和:对啊,夫妻本是同林鸟嘛。。。

8.历史
老婆的历史知识不能说缺乏,缺是不缺的,就是有点乱。
昨晚,我在准备晚饭,电视上播放的是描写秦末农民军起义的影片《入关之约》,老婆刚下班,扔下包,换鞋子,突然冒出一个问题:项羽是刘邦的大将吧?
差点被老婆的问题害得切到手,偶报复性地把老婆嘲笑了一番。
一会儿,电视上子婴手下的一个谋士正在陈述投降得理由:刘邦从谏如流,背后又有高人相助。。。
老婆又冒出一句话:刘邦背后的高人是诸葛亮吧?
偶把刀放在一边,改用手揪菜。

9.喝中药
在电脑前坐久了,或者工作忙起来顾不得喝水,人就容易上火。我火气就挺大,于是就看中医,喝中药,长这么大第一次喝中药(又献出了一个第一次)。
听说过中药难喝,但没想到那么难喝。几口下去,好奇变成了排斥,并且从心理上的排斥上升到了生理上的反应,我吐。看我难熬的样子,老婆很不屑地撇撇嘴,端起我的药碗一饮而尽,然后转身去看她的电视。
经过这次男人的尊严被无情践踏之后,我决定重新做人。第二次,硬着头皮在老婆的监考老师一样的眼光里很流畅地喝了两碗,然后潇洒地转身,出门,去洗碗。
后来老婆悄悄跟我说,那药真TMD难喝

6Park-笑话

想想当年,感觉偶真的很彪悍。
喜欢一男生,不小心他把篮球打我小腹上了...
装痛...
然后在扶我去医院的途中,去卫生间咬咬牙,把自己的M捅破...痛的差点晕过去
然后到医院检查说M破了...
然后他说我会对你负责的...
然后我们就在一起了...
然后我们就结婚了...
然后我把这件事告诉他了...
然后...
他说他那天一路上一直在祈祷我的M破掉吧...

与男友两地分隔,难的见一次面,这次请4天假来看他,还准备了10只tt··
今天最后一天了,还剩3个tt,
于是我说,丢掉?浪费了吧,今天全用了吧,
男友一脸惊愕的看着我:那一次套3个行吗··
我:······

上两天一个哥们儿来跟我报怨,说他去她GF家**,她GF正在洗澡,他在客厅等,突然,他的未来丈母娘闯进来了
“我只穿着一件衣服就被她看到了”
我想我这哥们儿应该不至于变态到就穿着上衣,就问“内Ku?”
没想到他说“是小雨衣”

我高中同桌是女生,名字叫冠雄,一次她爸带她到公司,遇到同事,就介绍说这是我女儿冠雄,那位叔叔哈哈大笑,一边捶她爸的背一边说,原来是女儿啊,哈哈哈哈,我一直以为冠雄是个男的,啊哈哈…我同桌很不高兴,就问她爸,这人是谁啊。她爸说哦,这就是我常给你说的丁香…

有天早晨,大家都在迷迷糊糊的时候,依稀看到老三的床上有个蓝色不明物体在挣扎,三分钟以后,不明物理伸出一个老三的头:“MD我睡觉钻被套里面去了。。。”众围观群众绝倒

读高中的时候,我同桌笑得时候笑声非常的奸~,有一天我趁他笑的时候我用手机把他的声音录了下来的,并设为来电铃声,结果最后全班都用我录音做来电铃声,他知道后非常生气,所以去向班主任告状,班主任最后罚我们写检讨书,再写一道歉书,然后把那铃声搞掉再删除,从此以后,那位同学都非常得意。
不久的一天,上班主任的课,上到一半的时候班主任的手机响了,只听见手机传来一阵阵奸笑的铃声:哇哈哈~哈哈哈~班主任的来电铃声竟然就是我的录音,再转头看同桌的他,.....已经是内牛满面..........

今天坐公汽看见大约三四岁的一个小男孩和一小女孩.小男孩跟小女孩说:我觉得世界上的小女孩都是红太狼,就你是美羊羊....

一次幼儿园数学考试得了100分。
于是妈妈使劲在麻将友里吹,正好他放学回来了。
于是一个麻友问:XX,一只鸭子几条腿?
我外甥说:2条腿.
那个麻友又问:那一只养了5年的鸭子几条腿?
我外甥数了一下手指头说:10条腿.............

高中时我胖,喜欢上一个学长,认识的.有次聊天他突然说:“要是现在是唐朝多好阿!”我大喜~心想他是不是喜欢肉肉的女孩子阿~就问为啥呀~他说:“那时候大家都喜欢胖的,那剩下的都是瘦的了,我可以慢慢挑了阿~”

老婆怀胎十月,现在儿子2个月了,整整一年,多少个夜晚修炼五龙抱柱……终于修成正果,昨晚和老婆爱爱的时候,5秒就KO了……耻辱的5秒……

某日无聊,在猫扑上发了一句“男 185cm 70kg 求包养”
立马回复很多 有问猛不猛的 有问要什么要求的
某人问了一句如何收费
A:按日收费
B:按次收费的好
C: 我觉得按质量收费
D:还是按流量收费吧...

大学时候,杭州萧山国际大酒店上有个旋转餐厅,我们很向往之。
半年后,终于有天我们三个人咬咬牙,凑了两千块,奔过去想奢侈一回。
然后,旋转餐厅的服务员巨热情地说,吃饭吗,自助火锅,28块一位。

刚看到有人二十五岁才分清尿尿跟爱爱的地方,想起一则旧闻,应该是10年前了,有一对夫妻婚后三年无子,去医院检查。结果是,CN膜完好,菊花括约肌松弛。

天朝的性教育...无语了。

真正CNT,话说本人经常出差,有此坐火车路过一小站,看窗口有卖松花蛋的,于是就花五块钱买了两个,又买一小瓶二锅头,准备在路上咪西咪西。到十一点半了,我美滋滋的拿出松花蛋,先去泥,然后………**GB,这是土豆。

某新年前夕猫扑上看到一哥们状态【哥保持了20年处男之身,今晚终于要...】遂 一帮禽兽围观询问
整点过后 此君签名为【突破21了】
再过几天,就可以去上海滩玩麻将了

话说我们数学老师还挺富的,有一次我到他们家去补课,家里装修得金碧辉煌,厨房阿什么都是欧式的,但是这时候我发现,那个很古典的酒架上,华丽丽的摆着一瓶酱油。。。

以前挺喜欢吃M的,和一个女性好朋友经常去,我吃的快。都吃完了,她还在那舔甜筒。她边吃我边扣鼻shi,鼻shi扣出来一弹,落在她的甜筒上,我伸手想去告诉她,她以为我想抢她的甜筒,飞快的把甜筒吃光了…

shanmu老总最近火了,路上听到的对话:
A—— “震惊!山木总裁因为强j门而辞职。。。”
B—— “畜生啊!连门也要强j!!!

我杯具了,游戏中的老婆告诉我他是一个男的,更杯具的是他说他是个背背,最杯具的是他说他真的喜欢我,接下来就是餐具了,他说他要来看我了…

昨晚见到林俊杰了,高中时候超爱他,兴奋地睡不着觉,半夜把校内更新状态为:啊啊啊啊,JJ,我超爱你~~
今早起床收到一个男生的短信:快把你那校内状态改了,傻妞!!!
我真不是那个意思,你们这帮XE的家伙

今天在小区里看到一只刚生完宝宝的狗狗,顿觉悲哀,她的咪咪比我大多了。。。。。

前几天
和小姐妹去春游
有2个男孩子不太熟悉的
++++++++
其中有1个
他的小拇指截掉一半
他说
小时候贪玩,用工厂冲床轧指甲
结果小指头轧去半截
+++++++++
我的小姐妹一脸崇拜
然后
没头没脑地说:
那你用什么挖鼻孔?
挖鼻孔……
……

我是一名酒店服务接待的,有时帮一下服务台的接电话。
今天我接过一个毕生难忘的电话。当时,!我认真而又亲切地接起电话:您好,请问您贵姓?有什么可以帮助您的?
"喂?"电话那头传来一个短促有力的男声。
我又问:请问您贵姓?
"喂?"
哟,看来是信号不好!
我再问:请问可以听见吗?
电话那头沉默了半响,随后肯定地回答:可以听见,我姓魏。"

想到一个老妈的事,以前老妈是幼儿园老师,她们幼儿园是周托的,就是一个星期回家一次,所以每到星期五学生都会很激动等家长来接,一般都是早上起来就开始等在班门口,看谁的家长来了就大喊:某某某,你爸爸(或者妈妈)来接你了!!然后被接的小孩就会在大家艳羡的目光中被接走。
那次周五我跟我哥一起去接我妈下班,还没走到门口,就听到有小孩大喊:老师老师,快点,你爸爸妈妈来接你回家了!!
我跟我哥满脸黑线········

今天…额应该是昨天了,终于和认识一个多月的女友初吻,吻出一根弯弯曲曲的毛…擦…

今天母亲节,想起老婆室友的糗事,还是在读书时,此人就已进化成终极御姐了,母亲节那天,御姐的母亲提了一大桶衣服准备去洗,御姐说:妈,今天是母亲节,你不要去洗衣服了,节日快乐!她母亲听后大为感动说:今天你帮我洗?御姐淡定的说:不,留着明天再洗。

记得那时候有个广告:尿频尿急尿不尽,请用前列康, 这姐们记住了, 然后吃了整整一个月的前列康。。。 杯具的是, 她不好意思的拿这个做我们卧谈会的话题, 结果所有人都茫然的说:没啥不对啊

哥住二楼,一柱香时间之前在阳台晾衣服,一穿校服初中生模样男孩背着书包打楼下过,边走边哼:我爱的人,不是我的爱人,她下面每一寸都属于另一个人…
声音洪亮中略带凄惨!
想必后面半句是她真**…

宿舍一哥们新买了件T恤,背后有一行字母 I C I S B O Y ,前几天上课时另一哥们和他女朋友坐其后面研究这行自母什么意思。这哥们说应该这么理解"我cao,我是boy",谁知他女朋友说
"应该是我cao,我是nb,哦耶!"..............

我是整形医生。现在,女孩正向我告白。“我喜欢你,把我的脸整形成你喜欢的样子吧。”这样的要求还是头一回听到。数小时后麻醉渐渐消除,她醒了,说:“我的脸怎么什么都没变?”我回答:“没错。我从以前就喜欢你了。”我们拥抱在了一起。“啊”,她自言自语,“我的胸部变大了”。——twitter小说佳作奖

我死party刚给我短信直播他们学校宿舍有人跳楼的事儿。。
据说警车啊。。消防车什么都到了。。
情势搞得很紧急。。。
校领导啊什么的都赶来了。。。
不过。。。
真相是。。。
某女半夜跑屋顶上放歌。。。
但唱得太磕碜了。。。
跟嚎啕大哭似的。。。
对面居民楼误以为要跳楼就报警了。。。
= =!

同事甲:你那个U盘,被我弄丢了,怎么办啊。。
同事乙:算了,又不值钱玩意。
同事甲:呵呵,你的心胸真宽广,像大海。。
同事乙:大海个P啊,最多像马桶,包容点屎事。

有个同学叫郑常川,小伙儿特帅,某日去商场买鞋,指着一双比较夸张的鞋说“这鞋我能穿吗?”服务员接道“你要是正常穿肯定能穿。”

做为机械07-3班的一名同学,每次被简称"机3班"的时候,都会深深同情一下机械8班的同学们

刚刚看湖人爵士比赛文字直播,一名观众名字“菊部地区有血”
菊部
…
有血

今天上新浪看新闻,娱乐版,头条---谢贤说“孩子长得像我”,谢霆锋杯具了………………

突然发现我们小时候唱的《健康歌》真是太XE了…
亮点:左三圈 右三圈 脖子扭扭 屁股扭扭

省略若干歌词…
爷爷说的容易 早上起床嘿咻 嘿咻
省略若干歌词………

小萱萱啊 跟着爷爷一起做 要看好喔 嘿咻! 嘿咻! 嘿咻! 嘿咻! 爷爷加油 加油

同学的弟弟,老师布置写名人名言的作业,他弟弟写到:下面是见证奇迹的时刻!--刘谦

这是我高中同学(女)的事,
话说此女小学乖乖巧巧,很招人喜欢,情窦初开的小男生又很多,其中有个胆大的就给她递纸条
男:我爱你××(小学基本上都是讲爱你爱你的,萌芽啊)
女的很彻底的回绝了:我不爱你
男的比较绝望,醋意大起:那你爱谁,是那个××吗?
女:我爱大自然
男:-_-#
大自然
大自然
大自然…

昨天跟一很久不见哥们儿喝酒,我问到他的婚姻情况,他说:“今年我换了好几个丈母娘…”我叹道:“我惊讶道.你也太强了”谁知他骂道:“MD!是我岳父太强了”

初中的时候老师要求我们每日积攒一句精典的标语,以应对中考,我是语文课代表,收上来之后看一哥们写的:向前一小步,文明一大步!问他为什么写这个,答曰:我估计咱老师可能一辈子都看不到这个标语,写了给她看看!(语文老师,女的)唉!

what a fucking day

从小一起耍的到的三姐妹,目前其中一MM变得开始不联系我,然后我在她校内留言,她一直没回复我。然后我以为她一直没登陆校内,然后准备去留第二次言,然后看到她跟一个不熟的男生的版聊。整篇除了我的留言,她都回了的!!。。。What a fucking day!

前几天晚上,我跟老婆XXOO到一半的时候已经睡着的儿子翻身(1岁半)看着我。。我吓一跳,然后对我一笑又翻过去继续睡了。。一身汗呐。。What a fucking day!

昨天同桌和我说。他在古文中看到,说是屁股挺而不摇的将是处女。我们的位置是第一排靠门。结果我们趴在桌子上看了一天进进出出的女生的屁股。一个班级只发现了两个符合要求的。今天过来,他和我说,现在看女生的眼光都变了。这时走来一个女生,我们不约而同的往她屁股看去。What a fucking day!

和同学去爬山。下山的时候看见路边有个池塘里面有很多的蝌蚪,然后把矿泉水倒掉,用水瓶装了很多的蝌蚪,很欢快的继续下山,正在聊天的时候,同学用一种怪异的眼神把我盯住,突然发现,我把那瓶装的有蝌蚪的当做矿泉水喝老。。。。。。。What a fucking day!

今天好久没联系的朋友,忽然来个电话,说想借我支付宝帮她付个款,杯具的是 我竟让答应了~更杯具的是她买的是男士内裤~~What a fucking day!

兴起问女友和我在一起之后有什么变化,她不语,我说变色了。。。她辩解曰近朱者赤近墨者黑。我一下子大声说:我是朱!!!....女友随之大笑...What a fucking day!

一个很久不联系的女性朋(我是男的)友给我打电话,上来就问我,“一根手指头伸进我下面,处女膜会破吗?”我就草!你丫好久不联系我,一上来就问我这问题!我耐着性子给她上了堂生理卫生课,然后还安慰她没事,放下电话越琢磨越觉得窝心。丫有这事怎么就想起我了!What a fucking day!

昨晚加班到很晚回去,出了地铁发现下大雨,等了半小时无果一咬牙淋着大雨冲回去了。今天早晨出门时发现雨伞就在包里。。。。What a fucking day!

暑假去邻居mm家玩,就两个人,我坐在沙发上看电视,突然mm跑回过来坐在我腿上,搂住我脖子的叫我哥哥,我兽性大发,把她抱起来走到卧室,压在床上,mm闭着眼睛,我摸着mm的mimi准备脱衣服,她突然睁开眼睛,看着我说:“我要做你老婆”我突然就想起我在还学校上学的lp来了,一把推开她,自己跑回家了What a fucking day !

早上在睡觉,突然被门外两个欧巴桑的聊天声音吵醒了。一怒之下拉开窗户骂了句,吵你MLGB啊。缓过来一看,是我大嬷嬷和二嬷嬷,因为敲门没人应,在门口聊天等我妈回来送钥匙的。更草蛋的就是,我骂完之后,发现我妈就站在离门口十米不远处。 What a fucking day!

那天开房看了一晚电视购物也罢了,昨晚她下班从她那个市坐车到我这个市,我心里那个美啊,想着今晚又可以开房了,激动的请吃饭玩游戏,看时间差不多了赶紧找了个地方开房,激动的掏钱手都在抖,进门扑倒在床上又亲又摸,她笑着说摸到什么了?你例假?她点点头。又看了一晚电视购物!What a fucking day!

从小有一个习惯,喜欢把指甲上倒卷皮顺着拉,直到拉出血来才心满意足what a fucking day!!

在宿舍煮扁肉,吃的时候一直觉得肉味怪怪的,既不像猪肉,也不像羊肉牛肉,舍友说,突然有个不好的联想,顿时我想到孙二娘,胃口全无……What a fucking day!!!

还有一个早晨洗漱间人太多 就在屋里洗漱了洗漱完去倒水 正在我拿着盆开门之际 我们屋的女SUPER踢门就进 一盆的漱口水就那么华丽的泼在了我的身上!!!!!What a fucking day!

就在刚才穿人字拖去楼道的公厕 左脚踩到了不知道哪个人渣遗落在便池边边的大便 转身之际左脚踩到了右脚 顿时诅咒遗落大便者全家。What a fucking day!

最近几天和刚买的手机过不去,一天摔个七八次,后盖掉了,屏碎了,晚上去倒水的时候脑子也抽了,一只手拿盆一只手拿手机,感觉拿不动盆了,就直接把手机扔进脏水里泡了What a fucking day!

昨天,我公司一挺可爱也挺漂亮的女同事主动约我一块儿吃晚饭,我也挺喜欢她的,就表白了,她没说答应;丫!结果今天又主动约我吃饭,我又屁颠颠的去了,又表白,她又没说答应……这到底是能不能能啊?What a fucking day!

(这些天经常对着五岁的外甥喊)把老子气死啦;老子刚给你洗了手,又脏了;老子刚收拾了玩具,又满天飞。。。终于某一天五岁的他用还不流利的语言认真的眼神看着我说:“老子,我饿了,老子,给我倒杯水。”我天旋地转~~What a fucking day!

与哥们一起租房子,他和他女友睡一个卧室,我和我女友睡另一个卧室。内哥们有个塑料杯,每天晚上睡觉前他都接一杯温水回卧室。有一次聊天,我就说,你这习惯挺好啊,每晚喝一杯水才睡觉~他低声跟我说:不是啦,要用温水洗过她才肯跟我做……kao~我还用那杯子喝过水~!What a fucking day!

寝室里聊天讨论怎么追女生,讨论的不亦乐乎…突然最腼腆的男生说:迷药,霸王硬上弓就可以了…寝全室无语…What a fucking day!

听同学说,他以前有张yellow盘,用VCD和DVD播放的是不同的内容。 What a fucking day!

半年前,哥的媳妇跟别人跑了,昨天,才知道是个外国人。原来,当初爱爱之后她说我JJ小,不是一句玩笑话。。。。。。。 What a fucking day!

舌尖上突发3个溃疡,喝口水都掉眼泪,结果老板正好从我身边路过,只见我手拿着文件,两眼泪汪汪...老板那神情...What a fucking day!

单独带着5岁大的女儿出去,在商场里她要尿尿,就带她一起进了男厕,刚让她尿完,一穿着制服的警察急吼吼地进来对着小便池就尿,女儿站在他的侧面,大声地说:哇,警察叔叔也要尿尿啊!还没来得及尴尬,拉起她的手就往外走,女儿又大声说:果然是警察叔叔厉害啊,尿得那么远!What a fucking day!

昨天下午收到老公短信:我5点过去接你。后面加了一个心形表情。我正打字准备问他什么意思,他打过来电话了,说今天晚上加班,不回来了。What a fucking day!

君开我未富,我富君已倒 君恨我富迟,我恨君被倒 君开我未富,我富君已倒 恨不荣同时,日日去君嫖 君开我未富,我富君已倒 君到天上去,我在人间悼 君开我未富,我富君已倒 另寻红灯区,夜夜到高潮 -----------悼念天上人间。What a fucking day!

不小心联系上一年没联系的女朋友,晚上主动找我说她晚上不回家,我当时就澎湃了,血液充斥着大脑和海绵组织,第一反应就是一定要开房,想了一小时不知道去哪开,最后她实在看不下去带我去了一家她熟悉的地方。为了表示我的伟岸,我说你睡吧我看会电视。一晚上纠结的看着电视购物!What a fucking day!

我是CN,我女朋友是CN,很难得,所以约定了新婚之夜再进行。6月我们就准备结婚了,结果她很诚恳的告诉我,不想欺骗我,其实他不是处了,我了个草,害哥白打了1年半的飞机。我现在那不是一般的纠结。很郁闷,不知道怎么办。What a fucking day!

室友偷吃东西吃完也不说一声,有次厕所被占用,憋不住,往饮料瓶里尿了一泡,过了两天发现又被喝了what a fucking day

南方的雨,下起来没完没了,晒在寝室外面的内裤忘记取进来,结果今天收进来发现内裤正面长毛了。。。。艹。。。。还是绿色的,what a fucking day!

一直看草蛋的我,终于也被草蛋上了。我看我前女友的相册,有一张照片上面是束花朵,备注写着:我们2个月了,谢谢老公。上传时间是4月5号。天啊,我们4月5号那天,分手还不到2个月。What a fucking day!

没有姐姐所以拿嫂子当姐姐,关系还不错。前日跟嫂子聊Q,嫂子问我会不会喜欢上离婚的人,后来又说想我了...我无语就说想我干什么,她说想我陪她说话、逛街。我哥天天出差不在家,嫂子天天QQ签名都变,没一个听着像家庭团结的。我无奈了....What a fucking day!

巨郁闷,今财务危机,问父亲借了点钱,直接打到账户的。晚上父亲来电话说:“儿子,欧盟援助希腊的款项已经打到账户了。” 突然发现我父亲太有才了!!!!What a fucking day!

今天去银行取钱,跑到提款机那,一堆人!!只好去业务窗口了,现在银行都要那种业务的水上小票,就去机器那拿了张,CD的是我一看NO.2222 ..............MD你才2!!!立马跑到提款机排队去了!What a fucking day!

那天看老公QQ在线,顺便看了下最近联系人,最上面是个女的,好奇就拉开来看了看,结果里面空白什么也没有,可下面的那些人却都有聊天记录,第二天我又看了看,记录还没来得及删,看到老公对别的女人说“要好好照顾自己,想你,而那个女的直接回,爱你” 我该不该离婚。What a fucking day!

突然发现,<新 闻 联 播>的牛X之处在于:即使你一直在换台,你也能完整地看完一条新闻•••what a fucking life,What a fucking day!

男生问:“知道男人吃伟哥的目的吗?”女生红着脸答:“想不出来。”男生惊叹道:“太精辟了。What a fucking day!