第十一章: 字符串和字符函数
1、字符串 = 字符数组+'\0';
2、printf("%s %p %c\n","we","are","student"); //%p输出十六进制的内存地址
3、char heart[]="I love Title!";
char *head ="I love Title!";
heart是个常量,head是个变量
putchar(heart[i]); 对 putchar(head[i]); 对
putchar(*(heart+i)); 对 putchar(*(head+i)); 对
putchar(*(heart++)); 错 putchar(*(head++)); 对
4、char name[MAX];
char *ptr;
ptr = gets(name); //多出来的字符简单溢出到相邻内存区
ptr = fgets(name, MAX, stdin); //MAX最大读多少 ,stdin从哪个文件读
puts(普通人);
fputs(ptr, stdout);
5、最有用和最常用字符串函数
strlen(str);
strcat(str1,str2); strncat(str1,str2, n);
strcmp(str1,str2); strncmp(str1,str2, n);
strcpy(str1,str2); strncpy(str1,str2, n);
sprintf(str,"%d %f“,1,1.5);
其他一些字符串函数:
char *strchr(s,c); //s中含有c的第一个位置
char *strrchr(s,c); //s中含有c的最后一个位置
char *strpbrk(s1,s2); //s1中存放s2的第一个位置
char *strstr(s1,s2);
6、命令行参数
int main(int argc, int char *argv[])
argc: 字符串数目
argv:字符指针数组
例子: c>code "i am a student" now
code: code.c程序名
argv[0]=code
argv[1]="i am a student" //可以通过引号连接字符串
argv[2]=now
7、字符串转为数字
A) atoi(str); atol(str)
atof(str); 返回double型
B)strtol(); 返回long
strtoul(); 返回unsigned long
strtod(); 返回double
原型:long strtol(const char *npr, char **endptr, int base);
第一个参数: 待转化字串
第二个参数: 指向标志输入数字的结束字符的指针
第一个参数: 转化为几进制
8、itoa()和ftoa()把数字转化为字符串,但两个函数不在ANSI C中,
为了兼容性更好,常用sprintf代替
第十二章: 存储类,链接和内存管理
1、链接 static
int a=5; //文件作用域,外部链接
static int b = 3; //文件作用域,内部链接
int main()
{...}
2、5种存储类(P324表,综合例子P33)
1)自动变量:函数或代码块头部定义的任意变量
int proc(void)
{
(auto)int plox; (auto)可选
. . .
}
2)寄存器变量
代码块内声明,寄存器变量多是存放在一个寄存器中而非内存中,故无法获得其他地址
int proc(register int a)
{
register int quick;
。。。
}
!可以使用register声明的类型有限,cpu可能无足够内存容乃double类型
3)具有外部链接的静态变量
声明在所有函数之外的具有文件域、外部链接和静态存储时期的变量;
为使程序清晰,可在使用外部变量的函数中再次用extern声明
4)具有内部链接的静态变量
定义在所有函数之外,使用static,具有内部静态链接的静态变量只可以
被与它在同一个文件中的函数使用。
int a=1; //外部链接
static int b=1; //内部链接
int main()
{
extern int a; //使用全局变量a
extern int b; //。。。。。。b
}
5)空链接的静态变量
定义在代码块内,使用static.
int prov(void)
{
static int a;
......
}
3、多文件中共享变量,一般一个文件定义外部变量,其他文件使用extern引用该变量
4、存储类和函数
使用static存储类的原因之一就是创建一个特定模块所私有的函数,从而避免
了可能的名字冲突。
使用extern来声明在其他文件中定义的函数,这一习惯做法主要是为了使程序
更清晰,因为除非函数声明使用static,否则默认extern
double gama(); //外部链接,可以被其他文件中的。。。使用
extern int procB(); //外部链接,可以被其他文件中的。。。使用
static int procA(); //特定模块私有
5、随机数函数的使用
#include<stdlib.h> //为srand()函数提供原型
#include<time.h> //为time()函数提供原型
int main(void)
{
scrand((unsigned int)time(0)); //随机化种子
int r = rand()%b+a; //取得[a,b)之间的一个随机值
......
}
6、分配内存:malloc()和free()
double *ptd;
分配: ptd=(double *)malloc(MAX*sizeof(double));
释放: free(ptd);
另一种分配方法:
long *mem;
mem=(long *)calloc(100, sizeof(long));
free(mem);
7、类型限定词
1)const 将数据限定为不变
2)volatile 表明数据除可以被程序修改还可以通过其他方式修改,其目的
是警示编译器在优化时不要做出相反的假设。
3)restrict也是为优化而设置(只可以用于指针),由restrict限定的指针被认为是对其所指向
的数据块的唯一访问途径