
c语言笔记
安瑾随风
这个作者很懒,什么都没留下…
展开
-
例解GNU C之表达式中的复合语句
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 在讲解新概念之前,先回顾一下在标准C中表达式和复合语句的概念,表达式指的是运算符和操作数的组合,而复合转载 2012-07-16 09:57:37 · 407 阅读 · 0 评论 -
作用域与函数传值调用
在C语言中,所有变量、宏、函数(函数的声明形式即为函数原型)、自定义数据类型以及别名等数据必须先声明后使用。通常在头文件中包含这些声明,如extern int global_data,这个声明只是告诉编译器全局变量的类型和名字,至于对它的定义(分配内存的声明即为定义)则在别处进行。 1、作用域 在C语言中,常见的有代码块(一对花括号之间的代码)作用域和文件作用域。 所转载 2012-07-16 10:04:17 · 601 阅读 · 0 评论 -
宏定义中的do { } while(0)语句
do { } while(0)在 Linux 内核中,经常会看到 do{}while(0)这样的语句,许多人开始都会疑惑,认为 do{}while(0)毫无意义,因为它只会执行一次,加不加 do{}while(0)效果是完全一样的,其实 do{}while(0)主要用于宏定义中。这里用一个简单点的宏来演示:#define SAFE_FREE(p) do{ free(p); p原创 2012-07-16 10:15:09 · 909 阅读 · 0 评论 -
例解GNU C之匿名联合或结构体
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 在GNU C中,可以在结构体中声明某个联合体(或结构体)而不用指出它的名字,如此之后就可以像使用结构体转载 2012-07-16 09:55:39 · 1094 阅读 · 0 评论 -
c语言中位段
位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。 含有位段的结构体类型称为位段结构。位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。位段结构中位段的定义格式为: unsigned :例如:struct bytedata{unsigned a:2; /*原创 2012-07-16 16:44:07 · 741 阅读 · 0 评论 -
C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
1.C变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。从作用域看:1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。2>静态局部变量具有局部作用域,它只被初始化一次,原创 2013-05-23 21:06:32 · 799 阅读 · 0 评论 -
编译型语言和解释型语言
编译型语言和解释型语言计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻原创 2013-05-24 16:48:17 · 670 阅读 · 0 评论 -
*p++和*++p的区别
接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1)。 1、++i和i++的区别 如清单1(注意代码中的注释): [cpp] view plaincopy#include int main(void) { int a, b, i = 7; i++; //等价于i = i + 1;转载 2012-07-16 10:02:39 · 745 阅读 · 0 评论 -
另类解读C语言数组的特性
数组的本质其实就是把多个相同数据类型的变量捆绑在一起使用而已。例如int a[10],其实质就是把10个整型变量按照地址从低到高的顺序依次分配在一段连续的40个字节的内存空间上。 1、一维数组 一维数组举例,如清单1: [cpp] view plaincopy#include int main(void) { int a[5] =转载 2012-07-16 10:01:40 · 597 阅读 · 0 评论 -
例解GNU C之零长数组与变长数组
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 1、零长数组 GNU C允许声明长度为零的数组,但它只能被用于结构体的最后一个成员。转载 2012-07-16 09:58:37 · 525 阅读 · 0 评论 -
例解GNU C之指定初始化项目
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 指定初始化项目(Designated Initializers):指的是可以对数组中的某些元素或结构体转载 2012-07-16 09:59:17 · 391 阅读 · 0 评论 -
例解GNU C之typeof
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 关键字typeof用于获取表达式的数据类型。 简单例子,如清单1: [cpp]转载 2012-07-16 10:00:05 · 389 阅读 · 0 评论 -
对比理解指针函数和函数指针
1、函数指针,可以这样理解,它首先是一个指针变量(一般占4个字节),只是它将要指向的数据类型为某种形式的函数。 举例如清单1: [cpp] view plaincopy#include int int_func(int a, int b) { return a + b; } char char_func(char a, char b转载 2012-07-16 10:00:58 · 401 阅读 · 0 评论 -
char *p = "123"和char a[] = "123"根本就不同
示例代码如下: [cpp] view plaincopy#include int main(void) { char *p = "123"; //等价于char *p; p = "123"; char a[] = "123"; //等价于char a[] = {'1', '2', '3', '\0' }; printf("ad转载 2012-07-16 10:04:56 · 904 阅读 · 0 评论 -
准确理解typedef的用法
在C语言中,关键字typedef用来为现有数据类型创建一个别名,而不是用来创建一个新的数据类型。 1、typedef的用法 简单的例子,如清单1: [cpp] view plaincopy#include typedef int type_int; int main(void) { type_int a = 0x102转载 2012-07-16 10:05:35 · 479 阅读 · 0 评论 -
二级指针与取地址运算符
接下来,我们结合下面的例子来理解二级指针的概念。[cpp] view plaincopy#include int main(void) { int a = 3; int *one_ptr = &a; //相当于int *one_ptr;one_ptr = &a; int **two_ptr = &one_ptr; //相当转载 2012-07-16 10:06:06 · 727 阅读 · 0 评论 -
简单而透彻地理解C语言指针
不少C语言初学者都感觉指针很难理解,其实造成这样的困扰,仅仅是因为指针变量的声明和使用方式与普通的变量(如整型变量)不同而已。 要透彻理解C语言指针,只要能看懂下面三点即可(结合下面的代码):[cpp] view plaincopy#include int main(void) { int *int_ptr; short *sho转载 2012-07-16 10:06:46 · 504 阅读 · 0 评论 -
linux内核container_of宏定义分析
一、#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;2. ((TYPE *)0)->MEMBER 访问结构中的数据成员;3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址;4.(size_t)(&(((TYPE*)0原创 2013-06-07 09:54:09 · 653 阅读 · 0 评论