漫谈C语言
tanglinux
专注于Linux内核以及C/C++应用程序的开发。
展开
-
简单而透彻地理解C语言指针
不少C语言初学者都感觉指针很难理解,其实造成这样的困扰,仅仅是因为指针变量的声明和使用方式与普通的变量(如整型变量)不同而已。 要透彻理解C语言指针,只要能看懂下面三点即可(结合下面的代码):#include int main(void){ int *int_ptr; short *short_ptr; char *char_ptr;原创 2011-11-01 17:49:50 · 2081 阅读 · 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允许声明长度为零的数组,但它只能被用于结构体的最后一个成员。原创 2011-11-25 17:31:00 · 8691 阅读 · 0 评论 -
例解GNU C之指定初始化项目
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 指定初始化项目(Designated Initializers):指的是可以对数组中的某些元素或结构体原创 2011-11-25 14:44:25 · 4342 阅读 · 1 评论 -
例解GNU C之表达式中的复合语句
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 在讲解新概念之前,先回顾一下在标准C中表达式和复合语句的概念,表达式指的是运算符和操作数的组合,而复合原创 2011-11-27 14:52:51 · 3777 阅读 · 1 评论 -
作用域与函数传值调用
在C语言中,所有变量、宏、函数(函数的声明形式即为函数原型)、自定义数据类型以及别名等数据必须先声明后使用。通常在头文件中包含这些声明,如extern int global_data,这个声明只是告诉编译器全局变量的类型和名字,至于对它的定义(分配内存的声明即为定义)则在别处进行。 1、作用域 在C语言中,常见的有代码块(一对花括号之间的代码)作用域和文件作用域。 所原创 2011-11-06 16:19:28 · 1576 阅读 · 0 评论 -
指针的运算
其实,在C语言中,指针功能的强大,主要体现在指针变量的间接运算上,指针涉及的运算并不多。 1、基本运算 指针变量的基本运算包括赋值、取地址以及取值(间接运算)等运算。 举例,如清单1: #include int main(void){ int a = 5; int *p = &a; int b = *p; *原创 2011-11-06 19:35:09 · 18958 阅读 · 2 评论 -
*p++和*++p的区别
接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1)。 1、++i和i++的区别 如清单1(注意代码中的注释): #include int main(void){ int a, b, i = 7; i++; //等价于i = i + 1; ++i; //等价于i = i + 1;原创 2011-11-07 13:47:15 · 163341 阅读 · 12 评论 -
例解GNU C之匿名联合或结构体
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 在GNU C中,可以在结构体中声明某个联合体(或结构体)而不用指出它的名字,如此之后就可以像使用结构体原创 2011-12-04 12:43:49 · 9121 阅读 · 3 评论 -
char *p = "123"和char a[] = "123"根本就不同
示例代码如下: #include int main(void){ char *p = "123"; //等价于char *p; p = "123"; char a[] = "123"; //等价于char a[] = {'1', '2', '3', '\0' }; printf("address a = %p, p = %p, &p = %p\n"原创 2011-11-03 23:26:08 · 8966 阅读 · 0 评论 -
准确理解typedef的用法
在C语言中,关键字typedef用来为现有数据类型创建一个别名,而不是用来创建一个新的数据类型。 1、typedef的用法 简单的例子,如清单1: #include typedef int type_int;int main(void){ type_int a = 0x10203040; short b = a;原创 2011-11-02 14:36:56 · 3010 阅读 · 0 评论 -
另类解读C语言数组的特性
数组的本质其实就是把多个相同数据类型的变量捆绑在一起使用而已。例如int a[10],其实质就是把10个整型变量按照地址从低到高的顺序依次分配在一段连续的40个字节的内存空间上。 1、一维数组 一维数组举例,如清单1: #include int main(void){ int a[5] = {1, 2, 3, 4, 5}; int *p = a; /原创 2011-11-24 00:12:48 · 2971 阅读 · 0 评论 -
对比理解指针函数和函数指针
1、函数指针,可以这样理解,它首先是一个指针变量(一般占4个字节),只是它将要指向的数据类型为某种形式的函数。 举例如清单1: #include int int_func(int a, int b){ return a + b;}char char_func(char a, char b){ return a + b;}int main(void)原创 2011-11-24 12:49:44 · 1378 阅读 · 0 评论 -
二级指针与取地址运算符
接下来,我们结合下面的例子来理解二级指针的概念。#include int main(void){ int a = 3; int *one_ptr = &a; //相当于int *one_ptr;one_ptr = &a; int **two_ptr = &one_ptr; //相当于int **two_ptr; two_ptr = &one_p原创 2011-11-01 22:48:38 · 7572 阅读 · 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: char *chpt原创 2011-11-24 15:01:15 · 7715 阅读 · 7 评论