c语言
文章平均质量分 92
张鸷
这个作者很懒,什么都没留下…
展开
-
const char *p/char const *p/char * const p有何区别
const char *p、char const *p和char * constp的区别是什么? 前两者可以互换,它们声明了指向字符常量的指针,这意味着不能修改它所指向的字符的值;“char * const p”声明了指向字符的常量指针,这意味着不能修改该指针。 验证代码: 1 #include 2 3int main(){ 4 5原创 2015-10-16 11:52:37 · 425 阅读 · 0 评论 -
C语言strchr函数
strchr函数原型:extern char *strchr(const char *s,char c);查找字符串s中首次出现字符c的位置。C语言char *strchr(const char* _Str,int _Val)char *strchr(char* _Str,int _Ch)头文件:#include 功能:查找字符串s中首次出现字符c的转载 2015-11-09 17:06:04 · 6120 阅读 · 0 评论 -
C语言strstr函数
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。C语言函数包含文件:string.h函数名: strstr函数原型:1extern char *strstr(char *str1, const c转载 2015-11-09 17:07:50 · 12554 阅读 · 0 评论 -
怎样写参数个数可变的宏
用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表,如:void printf(const char* format, …);直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中。C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可变参数转载 2015-11-10 15:35:19 · 437 阅读 · 0 评论 -
如何定义函数式宏
众所周知,宏扩展是纯粹的文本扩展,若定义不明确,就会导致结果错误,或者编译错误,尤其是定义函数式宏时,下面有三条规则可以使我们避免出错。 规则1:宏体必须使用括号包起来,以便保护表达式中低优先级的操作符。 例: #define square(x)x*x原创 2015-11-10 16:47:18 · 1575 阅读 · 0 评论 -
strchr函数
函数原型:extern char *strchr(char *str,char character)参数说明:str为一个字符串的指针,character为一个待查找字符。 所在库名:#include 函数功能:从字符串str中寻找字符character第一次出现的位置。 返回说明:返回指向第一次出现字符character位置的指针,如果没找到则转载 2015-10-26 10:56:49 · 423 阅读 · 0 评论 -
将第一个换行符转换成’\0’
将换行符转换成’\0’的代码实现如下: 假设字符串src中存在一个或多个’\n’字符,我们需要将第一个’\n’转换成’\0’。代码如下: char*temp; if((temp=strchr(src,‘\n’))!=NULL)*temp=’\0’;原创 2015-10-26 11:09:17 · 494 阅读 · 0 评论 -
C语言gets()函数:从流中读取字符串
头文件:#include gets()函数用于从缓冲区中读取字符串,其原型如下: char *gets(char *string);gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。【返回值】若成功则返回string的指针,否则返回NULL。注意:由于gets()转载 2015-10-26 10:59:46 · 2658 阅读 · 0 评论 -
C语言strcat()
原型:char *strcat ( char *dest, const char *src) 用法:#include 功能:连接两个字符串;strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。 说明:strcat()返回dest的字符串起始地址。 举例:转载 2015-10-26 11:48:45 · 526 阅读 · 0 评论 -
用宏怎么构造标识符
用宏怎么构造标识符 怎么用宏来构造标识符,需要引用符号粘贴操作符——##,“##”的作用是将右边“操作数”追加到左边“操作数”,将最后的符号标识作为变量的标识符,不过最后的标识符要符合标识符的规定。例如: #define PASTE(a, b) a##b 应用: char *PASTE(te, st) = “Hello, wo原创 2015-11-11 11:04:54 · 922 阅读 · 0 评论 -
struct和typedef struct
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是转载 2015-09-23 13:21:42 · 317 阅读 · 0 评论 -
C语言ADT(抽象数据类型编程)
C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体应用比如单片机以及嵌入式系统开发。(摘自“百度百科”)在嵌入式系统开发中,随着系统功能要求越来越多,除了硬件系统不断扩展外,芯片中软转载 2015-09-23 13:03:32 · 20473 阅读 · 0 评论 -
函数调用时,需注意实参和形参的类型差异,类型内存存储格式的差异
问:能否像下边这样用void **指针作为参数,使函数模拟按引用传递参数吗? void f(void **); double *dp; f((void **)&dp);答:不可移植,这种代码可能有效,而且有时鼓励这样用,但前提是所有指针的内部表示都是一样的,也即内存中数据存储格式一样。 C语言中没有通用指针类型,v原创 2015-10-27 14:01:16 · 1364 阅读 · 0 评论 -
C语言中void具体有什么作用
1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 void几乎只有“注释”和限制程序的作用,因转载 2015-10-14 14:20:02 · 1084 阅读 · 0 评论 -
C语言之typedef int (*funcptr)()
问:“typedef int (*funcptr)();”是什么意思? 答:它定义了一个类型funcptr,表示指向返回值为int型,参数未指明的函数指针,它可以被用来声明一个或多个函数指针,例如: funcptr func1, func2; 这个声明等价于下面写法的函数指针声明 int (*func1)(), (*func2原创 2015-10-14 23:28:22 · 5744 阅读 · 0 评论 -
const限定符修饰的常量变量能否作为数组声明的维度、case行标或其他类似场景?
看有些书籍上说,下面的使用方法是不可以的: constint n=5; inta[n];书上是这样解释的:const限定词真正的含义是“只读”,用它限定的对象在运行时是不可以赋值修改的,对象可以是基本类型,也可以是指针。因此用const限定的对象并不是完全意义上的常量,不能用作数组维度、case行标或类似环境。在这原创 2015-10-16 11:07:12 · 2169 阅读 · 0 评论 -
不同变量类型的不同输出格式
符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例-- -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%usigned -- char 8转载 2015-10-22 14:43:49 · 1174 阅读 · 0 评论 -
ASCII码
ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符0NUT32(space)64@96、1SOH33!65A97a2STX34"转载 2015-10-28 10:02:19 · 632 阅读 · 0 评论 -
realloc函数
realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);函数说明语法指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。新的大小可大可小(但是要注意,如果新的大小小于原内存大小,可能会导致数据丢失,慎用!)头文件#in转载 2015-11-09 16:51:38 · 734 阅读 · 0 评论 -
内存对齐
一.内存对齐的初步讲解内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”例如int类型占用4个字节,地址只能在0,4,8等位置上。例1:#include struct xx{ char b; int a; int c; char d;};int main()转载 2015-10-09 18:44:27 · 310 阅读 · 0 评论 -
"typedef char * pc; const pc a;“ 为什么是a而不是a所指向的字符为const
问:声明如下: typedefchar * pc; constpc a;为什么是a而不是a所指向的字符为const? 答:typedef的替换并不是简单的替换,在声明中, constpc a;a被声明为const的原因跟const inti中的i被声明成const的原因一样,a的声明不会“深入”typedef的内容来发现涉原创 2015-10-16 14:20:26 · 517 阅读 · 0 评论 -
为什么不能向接受const char **的函数出入char ** ?
问:为什么不能向接受const char **的函数传入char **? 答:定理:允许向接受const T的指针的地方传入T型指针,任何类型T都适用。但是,这种允许,也即在被限定的指针类型上轻微不匹配的规则却不能递归应用,只能应用在最上层。由此就可以回答上面的问题了,因为const char **是const char的指针的指针,所以这个规则在这时就不适用了。 co原创 2015-10-16 14:04:11 · 7105 阅读 · 0 评论 -
typecheck(type,x) 作用
在kernel 2.6.30 的typecheck.h源码中有如下定义#define typecheck(type,x) /({ type __dummy; / typeof(x) __dummy2; / (void)(&__dummy == &__dummy2); / 1; /})这个有什么作用呢?下面举例来转载 2015-10-16 18:39:55 · 763 阅读 · 0 评论 -
函数指针的赋值与调用
问:先定义了个函数:int function(int a, int b){ ..........}main函数里面有个函数指针问题1:那么下面两种对函数指针的赋值哪个是正确的,还是都可以?int main(void){ A: int (*FP)(int, int) = function; B: int (*FP)(int, int) =转载 2015-10-19 18:34:42 · 18896 阅读 · 1 评论 -
运算符优先级查询表
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[整型表达式]左到右 ()圆括号(表达式)/函数名(形参表) .原创 2015-10-19 19:28:23 · 447 阅读 · 0 评论 -
函数类型,函数名是函数指针吗,函数的强制类型转换
问一:函数有类型吗?答:有,举两个例子即可明白:例1:char func()的类型为char (*)() 例2:int * func1(char a)的类型为int *(*)(char)问二:函数名是函数指针吗?答:个人认为函数名同数组名一样都是个常量,表示函数体的首地址,并不是完全意义上的函数指针。问三:函数的强制类型转换答:可以看如下代码:void fu原创 2015-10-19 19:16:35 · 3389 阅读 · 0 评论 -
C语言中用什么方法实现抽象数据类型最好?
问:C语言中用什么方法实现抽象数据类型最好?答:用户使用指向未公开定义的结构类型的指针绝对是个好办法。换言之,用户只需要使用结构的指针,如不需要知道结构的成员是什么,如调用参数或返回值为该结构指针的函数;只要不使用->、sizeof()、操作符及真实结构的声明,C语言就可以正确的处理不完全类型的结构指针;只有在实现抽象数据类型的原文件中才需要此范围内的完整声明。原创 2015-10-20 12:42:08 · 1806 阅读 · 0 评论 -
C语言标识符的3大属性
原创 2015-10-20 14:37:17 · 748 阅读 · 0 评论 -
针对struct name结构做的简要变幻
问:在代码里遇到这样的结构:struct name{ intnamelen; charnamestr[1];};在后续的代码里使用内存分配技巧使数组成员用起来像有多个元素,namelen记录了数组元素的个数,感觉有些不合理,但是代码里确实存在,该如何解释? 答:不清楚这种做法的合法性,但是这种技术确实存在,但又不符合C语言的规定,下面看几原创 2015-10-21 10:37:06 · 1358 阅读 · 0 评论 -
联合体(union)的使用方法及其本质
1.联合体union的基本特性——和struct的同与不同union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全转载 2015-10-22 12:35:03 · 476 阅读 · 0 评论 -
C语言 文件的概念与操作(打开、读写和关闭等)
文件的基本概念 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。 普通文件是指驻留在磁盘或其它外部介质上转载 2015-10-21 14:57:21 · 1201 阅读 · 0 评论 -
数组与指针详解
一、数组与指针的基本关系C语言的初学者,对数组和指针的关系含混不清,其实一句话就可以道出两者的关系——“在C语言中, 只有指针算术和数组下标运算是等价的,指针和数组是不同的”。 很多人认为char a[]与char *a是等价的,也许他们看到的是在函数的形参中char a[]与char *a可以相互替换,而误以为两者等价,实则完全不然。 例如:若char原创 2015-11-06 17:46:57 · 403 阅读 · 0 评论 -
如何确定域在结构中的字节偏移量,怎样用结构成员名访问对应成员?
ANSI C在中定义了offsetof()宏,用offsetof(struct_type,name)可以计算出成员name在结构struct type中的偏移量,如果处于某种原因,需要自己实现这个功能,可以使用下面这样的代码: #define offsetof(type, name) (size_t) ((char*)&((type *)0)->name-(char *)((t原创 2015-10-22 11:01:34 · 774 阅读 · 0 评论 -
未定义表达式
相关C语言的书籍里面说“a[i]=i++;”语句是非法的,具体如下: 问:为什么下面的代码不可以? a[i] = i++; 答:子表达式i++有一个副作用,那就是它会改变i的值,由于i在同一表达式的其他地方被引用,因此会导致未定义的行为。无从判断该引用是旧值还是新值。注意,尽管在其他文献中认为这类表达式的行为时不确定的,但C标准却强烈声明它是未定义的 由原创 2015-10-22 16:21:27 · 1193 阅读 · 0 评论 -
C语言的枚举类型
在实际应用中,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。 定义一个变量是枚举类型,可以先定义一个枚举类型名,然后再说明这个变量是该枚举类型。例如: enum weekday{sun,mon,tue,wed,thu,fri转载 2015-10-22 14:50:28 · 380 阅读 · 0 评论 -
C语言中的类型提升——基础概念,但还有很多人搞不清
每天都会看CU的博客,尤其是CU首页上面的博客。个人感觉有很多同学并不关注基础知识,在遇到问题时,经常会舍本求末。遇到问题,总是找不到根本原因,得出了一些结论。但这些结论并不是真正的原因,整个儿过程,也把真正的原因给掩盖了。今天主要说一下C语言的类型提升的事情。下面是引用的一个例子——这个代码是从一个朋友的博文中复制过来的,但是当时这位朋友没有去说明转载 2015-10-23 14:45:55 · 2282 阅读 · 0 评论 -
((condition) ? a : b) = complicated_expression是否可行
验证代码: 1 #include 2 3 int main(int argc, char **argv){ 4 int a,b; 5 int c=9,d=3;//((1)?a:b)=c*d;//note1 6 *((1)?&a:&b)=c*d;//note2原创 2015-10-23 15:26:18 · 537 阅读 · 0 评论 -
C语言类型转换详解
前言:C语言的类型转换是很多初学者的难点,但也是语言的重点。在此,介绍一下C语言类型转换的知识。注意本文是以gcc编译器为基准。一、 变量1、 基本类型变量说到基本类型,各种类型就会浮现在脑海中:char(%c、%d、%u)、short(%hd)、int(%d)、long(%ld)、long long(%lld)及其对应无符号类型unsigned char(%原创 2015-11-02 17:07:54 · 28693 阅读 · 3 评论