星期三, 三月 15, 2006
一些学习笔记,给自己看的,备忘
1.声明数组的一种方式:
int * data; //定义一个指针
int size = 8;
data = new int[size]; //该指针是数组的引用
int* data;
data = new int ;中new符用以动态分配内存,后续可以:
data[i] = i;
2.C++中声明常量的方法有两种:
A #define Num
B const char* c= “friend”;
3.char * s = “12345n” = char s[] = “12345”
Cout<<s 结果是12345
Cout<<*s 和 cout<<s[0]结果都是1
int* i[] = {1,2,3,4,5}
cout<<i 结果是 地址
cout<<i[0] 结果是1
4. printf 探讨
原型:extern void printf(const char *format,...);
用法:#include <stdio.h>
功能:格式化字符串输出
说明:format指定输出格式,后面跟要输出的变量
目前printf支持以下格式:
%c 单个字符
%d 十进制整数
%f 十进制浮点数
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
%% 输出百分号%
一个格式说明可以带有几个修饰符,用来指定显示宽度,小数尾书及左对齐等:
- 左对齐
+ 在一个带符号数前加"+"或"-"号
0 域宽用前导零来填充,而不是用空白符
域宽是一个整数,设置了打印一个格式化字符串的最小域。精度使用小数点后加数字表示的,
给出每个转换说明符所要输出的字符个数。
注意:带修饰符的显示可能不正常
举例:
// printf.c
#include <stdio.h>
#include <system.h>
main()
{
int i;
char *str="GGV";
clrscr();
textmode(0x00);
printf("Printf Demo-%%c");
printf("--------------");
printf("%c-%c-%c-%cn",'D','e','m','o');
printf("%2c-%2c-%2c-%2cn",'D','e','m','o');
printf("%02c-%02c-%02c-%02cn",'D','e','m','o');
printf("%-2c-%-2c-%-2c-%-2cn",'D','e','m','o');
getchar();
clrscr();
textmode(0x00); // not nessary
i=7412;
printf("Printf Demo-%%d");
printf("--------------");
printf("%dn",i);
printf("%14d",i);
printf("%+10dn",i); // output format not correct(bug)
printf("%-10dn",i);
getchar();
clrscr();
printf("Printf - d,o,x");
printf("--------------");
printf("%dn",i);
printf("%on",i); // %o and %x not implemented
printf("%xn",i);
getchar();
clrscr();
printf("Printf Demo-%%s");
printf("--------------");
printf(" %sn","Demo End");
printf(" %sn","Thanx");
printf(" %sn %s","Golden","Global View");
getchar();
return 0;
}
5. fread函数和fwrite函数
size_t fread(void *buffer, size_t size, size_t count, FILE *fp):从文件fp中读入count次
,每次读size字节,读入的信息存在buffer指针指向的缓冲区。函数返回值等于实际读入的次数(可能少于count)。
size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp):将buffer地址开始
的信息,写入count次,每次写size字节至文件fp中。函数返回值等于实际写入的次数(可能少于count)。
[例]、结构体类型数据。
struct student_type
{
char name[10];
int num;
int age;
char addr[30];
}stu[40];
写入文件:
for(i=0; i<40; i++) /* 每次写一个学生 */
fwrite(&stu[i], sizeof(struct student_type), 1, fp);
或:写一次
fwrite(stu, sizeof(struct student_type), 40, fp);
从磁盘文件读出:
for(i=0; i<40; i++)
fread(&stu[i], sizeof(struct student_type), 1, fp);
或:
fread(&stu[i], sizeof(struct student_type), 40, fp);
使用时是fopen,fread ,fclose 不要忘记释放内存
例如:
FILE * stream;
int i;
stream = fopen(“/tmp/fwrite”,”r”);
fread(s,sizeof(struct test),nmemb,stream);
fclose(stream);
6.trim()
这是去掉空格函数
S = rs.getStream(number1).trim();
这是java中使用的方法,C/C++ 中的使用略有不同,要带参数,但都是小小菜
其中有一点 number1 不能为null 否则编译将不能通过。
7. 有了malloc/free为什么还要new/delete ?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
例子
Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存
a->Initialize(); // 初始化
//…
a->Destroy(); // 清除工作
free(a); // 释放内存
void UseNewDelete(void)
{
Obj *a = new Obj; // 申请动态内存并且初始化
//…
delete a; // 清除并且释放内存
}
现在C++中已经很少用第一种方法了



