[C程序设计语言]第四部分
sizeof3
类型定义(typedef)3
联合体(union)4
可变参数... 4
字符串操作函数... 5
字符测试和转换函数... 6
数学函数... 6
随机函数... 7
存储管理函数(malloc/ calloc)7
结构体
struct point {
intx;
inty;
} x, y;
关键字struct后面的个运算符的优先级最高:结构运算符“.”和“->”、用于函数调用的“()”以及用于下标“[]”:++p->len相当于++(p->len),可以使用括号改变其运算结合顺序,如(++p)->len,但(p++)->len则还是先对len执行操作,然后再将p加上1,这里的括号其实可以省略,因为这是由于 p++ 的特性决定的(先使用再加1); *p->str读取的是指针str所指向的对象的值;
*p->str++先读取指针str指向的对象的值,然后再将str加上1(与*s++相同):
struct point {
char * str;
inty;
}/* *p */;
int main(int argc, char * argv[]) {
//这里的结构指针变量不能在外层结构体声明时在后面定义,
//否则运行时会出问题,不知道原因是什么,但书上好像也
//是这么定义的
struct point *p;
p->str = "abcd";
printf("%c\n", *p->str++);//a
printf("%s", p->str);//bcd
return 0;
}
(*p->str)++将指针str指向的对象的值加1;
*p++->str先读取指针str指向的对象的值,然后再将p加1;
结构数组:
struct point {
char * str;
inty;
} keytab[] = { { "auto", 0 }, { "break", 1 } };
如果初值是简单变量或字符串,并且其中的任何值都不为空,则内层的花括号可以省略。通常情况下,如果初值存在并且方括号[]中没有数值,编译程序将计算数组keytab中的基数。
结构指针:
struct point {
char * str;
inty;
};
int main(int argc, char * argv[]) {
struct point keytab1 = { "auto1", 1 };
struct point keytab2[] = { { "auto2", 2 }, { "break", 1 } };
struct point *p1 = &keytab1;//可以指向一个结构体变量
printf("%s\n", p1->str);//auto1
printf("%c\n", *p1->str);//a
printf("%s\n", p1->str + 1);//uto1 注,这里是先取地址,再将地址加1
struct point *p2 = keytab2;//也可以指向一个结构体数组对象
printf("%s\n", (p2 + 1)->str);//break
return 0;
}
sizeof
C语言提供了一个编译进一元运算符sizeof,它可以用来计算任一对象的长度,表达式:
sizeof 对象
以及
sizeof(类型名)
将返回一个无符号整数,它等于指定对象或类型占用的存储空间字节数。其中对象可以是变量、数组或结构;类型可以是基本类型,如int、double,也可以是派生类型,如果结构类型或指针类型。针对以下结构体:
struct point {
char * str;
inty;
} keytab[] = { { "auto", 0 }, { "break", 1 } };
结构对象与结构类型长度计算如下:
printf("%d\n", sizeof keytab);//16
//因为结构体中每个成员的长度是按最长成员来计算的,所以不是5,而是8
printf("%d", sizeof (struct point));//8
注,sizeof可以用在 #define 语句中,但不能用在条件编译语句 #if 中。
类型定义(typedef)
typedef int Length;将Length定义为与int具有同等意义的名字。类型Length可用于类型声明、类型转换等,它和类型int完全相同:
Length len,maxlen;
Length *lengths[];
类似地,声明
typedef char * String;
将String定义为与char*或字符指针同义,此后便可以在类型声明和类型转换中使用String,例如:
String p;
int strcmp(String,String);
p=(String)malloc(100);
也可定义结构体:
typedef structtnode {
char * str;
inty;
} Treenode;
typedef struct tnode * Treeptr;
定义函数指针:
typedef int (*PFI)(char *,char *);
该语名定义了类型PFI是“一个指向函数的指针,该函数具有两个char * 类型的参数,返回值类型为int”,定义后,可以这样使用:
PFI strcmp,numcmp;
联合体(union)
一个联合体变量可以合法地保存多种数据类型中任何一种类型的对象(同一时刻只能保存某一种),读取的类型必须是最近一次存入的类型:
可变参数
可以使用<stdarg.h>中的一组宏定义来操纵可参数。
VA_LIST的用法:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
#include<stdio.h>
#include<stdarg.h>
/*求和*/
int sum(int first, ...) {
int sum = 0, i = first;
va_list marker;//定义一具VA_LIST型的变量,这个变量是指向参数的指针
/*first一般表示可变参数列表中的前面最近第一个有名参数,如果前面有多个有
* 名参数,即使这里指定为前面最近第二个有名参数,但可变参数列表还是从最
* 后一个有名参数后面算起,对无名可变参数列表没有影响,但编译时会出警告,
* 另外,参数列表中至少要有一个命名参数,如果连一个命名参数也没有,就无法使用可变参数*/
va_start( marker, first ); /* 用VA_START宏初始化变量刚定义的VA_LIST变量,
这个宏的第二个参数是第一个可变参数的前一个参数,
是一个固定的参数。*/
while (i != -1) {
sum += i;
i = va_arg( marker, int);//VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
}
va_end( marker ); /* VA_END宏结束可变参数的获取 */
return sum;
}
main(void) {
/* Call with 3 integers (-1 is used as terminator). */
printf("sum is: %d\n", sum(2, 3, 4, -1));//9
/* Call with 4 integers. */
printf("sum is: %d\n", sum(5, 7, 9, 11, -1));//32
/* Call with just -1 terminator. */
printf("sum is: %d\n", sum(-1));//0
}
字符串操作函数
在头文件<string.h>中定义。在下面的各个函数中,s与t为char*类型,c与n为int类型。
strcat(s, t) 将t指向的字符串连接到s指向的字符串的末尾
strncat(s, t, n) 将t指向的字符串中前n个字符连接到s指向的字符申的末尾
strcmp(s, t) 根据s指向的字符串小于(s<t)、等于(s==t)或大于(s>t) t指向的字符串的不同情况,分别返回负整数、0、或正整数
strncmp(s, t, n) 同strcmp相同,但只在前n个字符中比较
strcpy(s, t) 将t指向的字符串复制到s指向的位置
strncpy (s, t, n) 将t指向的字符串中前n个字符复制到s指向的位置
strlen(s) 返回s指向的字符串的长度
strchr(s, c) 在s指向的字符串中查找c,若找到,则返回指向它第一次出现的位置的指针,否则返回NULL
strrchr(s, c) 在s指向的字符串中查找c,若找到,则返回指向它最后一次出现的位置的指针,否则返回NULL
字符测试和转换函数
头文件<ctype.h>中定义了一些用于字符侧试和转换的函数.在下面各个函数中,c是一个可表示为unsigned char类型或EOF的int对象。该函数的返回值类型为int。
isalpha(c) 若c是字母,则返回一个非0值,否则返回0
isupper(c) 若c是大写字母,则返回一个非0值,否则返回0
islower(c) 若c是小写字母,则返回一个非0值,否则返回0
isdigit(c) 若c是数字,则返回一个非0值,否则返回0
isalnum(c) 若 isalpha(c)或isdigit(c),则返回一个非0值,否则返回0
isspace(c) 若c是空格、横向制表符(\t)、换行符(\n)、回车符(\r),换页(\f)符或纵向制表符(\v),则返回一个非0值,否则返回0
toupper(c) 返回c的大写形式
tolower(c) 返回c的小写形式
数学函数
头文件<math.h>中声明了20多个数学函数。下面介绍一些常用的数学函数,每个函数带有一个或两个double类型的参数,并返回一个double类型的值。
exp (x) 指数函数ex
log (x) x的自然对数(以e为底),其中,x>0
1og10(x) x的常用对数(以10为底),其中,x>0
pow(x, y) 计算xy的值
sqrt(x) x的平方根(x>=0)
fabs(x) x的绝对值
随机函数
函数rand()生成介于0和RAND_MAX之间的伪随机整数序列。其中RAND_MAX是在头文件<stdlib.h>中定的符号常量。下面是一种生成大于等于0但小于1的随机浮点数的方法
#define frand() ((double) rand() / (RAND_MAX+1.0))
(如果所用的函数库中已经提供了一个生成浮点随机数的函数,那么它可能比上面这个函数具有更好的统计学特性)
函数srand(unsigned)设置rand函数的种子数。
存储管理函数(malloc/ calloc)
函数malloc和calloc用于动态地分配存储块。函数malloc的声明如下:
void *malloc(size_t n)
当分配成功时,它返回一个指针,设指针指向。
根据请求的对象类型,ma11oc或calloc函数返回的指针满足正确的对齐要求。下面的例子进行了类型转换:
int *ip;
ip=(int *) calloc(n, sizeof(int))
free(p)函数释放p指向的存储空间,其中,p是此前通过调用malloc或calloc函数得到的指针。存储空间的释放顺序没有什么限制,但是,如果释放一个不是通过调用malloc或callloc函数得到的指针所指向的存储空间,将是一个很严重的错误。
使用己经释放的存储空间同样是错误的。下面所示的代码是一个很典型的错误代码段,它通过一个循环释放列表中的节点:
for (p=head; p !=NULL; p=p->next)
free(p);
正确的处理方法是,在释放节点之前先将一切必要的信息保存起来,如下所示
for (p=head; p!=NULL; p=9){
q= p->next;
free(p);
}
[C程序设计语言]第四部分的更多相关文章
- 《C++程序设计语言(英文第四版)》【PDF】下载
<C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...
- 《C语言程序设计(第四版)》阅读心得(一)
本篇开始写我个人觉得谭浩强老师的<C语言程序设计(第四版)>中之前没有认识到,或者忘了的知识.因为本科学过,所以有些简单的东西就没有放进来了,所以可能并不是太全面. 第一章程序设计与语言 ...
- 20145225《Java程序设计》 实验四 Android开发基础
20145225<Java程序设计> 实验四 Android开发基础 实验报告 实验内容 安装Android Studio 运行安卓AVD模拟器 使用安卓运行出虚拟手机并显示HelloWo ...
- 《C++程序设计语言(十周年纪念版)》【PDF】下载
<C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- Notes 20180506 : Java程序设计语言概述
2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...
- 20145328 《Java程序设计》实验四实验报告
20145328 <Java程序设计>实验四实验报告 实验名称 Andoid开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android ...
- c++学习书籍推荐《C++程序设计语言(特别版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...
- PL真有意思(二):程序设计语言语法
前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语 ...
随机推荐
- js回调函数(callback)理解
Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...
- 免安装版Tomcat6.0启动方法
免安装版Tomcat6.0启动方法 1.下载Tomcat Zip压缩包,解压. 2.修改startup.bat文件: 在第一行前面加入如下两行 SET JAVA_HOME=JDK目录 SET CATA ...
- webservice cxf error:类的两个属性具有相同名称 "password"
execption detail: Caused by: javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.Servic ...
- iOS 开发 证书总结 开发证书和生产证书的区别
IOS开发 证书总结 开发者证书 ------>> 开发证书是你在真机推送时 用得, 生产证书是app 上架之后 推送给用户用的 首先你必须获得apple开发者证书,上图这个文件就是 ...
- PHP中Array关于数组的用法
使用函数array_keys(),得到数组中所有的键,参数:数组 $arr=array();$arr['one']="one";$arr['two']="two" ...
- getElementByClassName()不兼容的解决办法
在获取元素时候采用getElementByClassName()方法是比较方便的,但是对于IE6不兼容,可以采用以下代码来自定义这个方法: window.onload=function(){ if(! ...
- JavaScript DOM 编程艺术(第2版)读书笔记(5)
最佳实践 平稳退化 网站的访问者完全有可能使用的是不支持Javascript的浏览器,还有一种可能是虽然浏览器支持Javascript,但用户已经禁用它了.如果没有考虑到这种情况,人们在访问你们的网站 ...
- 【转】西门子数控系统中MMC、PCU、NCU、CCU简略介绍
转载地址:http://cyj221.blog.163.com/blog/static/34194117201093005526170/ 2010-10-30 01:06:09| 分类: 机械制造 ...
- weblogic远程调试
修改 bin/startWebLogic.cmd 增加红字部分,其中9999是调试监听端口,然后可以连接这个端口进行远程调试 set JAVA_DEBUG=-Xdebug -Xnoagent -Xru ...
- Spring框架bean的配置(3):基于注解的配置
1.基于注解的配置: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Contr ...