1、根据ansi标准,数组没有被初始化的元素将被设置为0,不过最好不要依赖编译器来初始化元素的值
2、暂停滚屏或者等待输入的交互的一种方式,是利用getchar();
3、如果程序使用超过界限的下标来访问数组元素,编译器不会报错,但会产生不确定的值
4、不要使用未初始化的指针,否则结果将是灾难性的
int *pointer = NULL; /* 初始化指针 */
5、指针与数组间存在特殊的关系,数组名是一个指向该数组的指针。要存储某种类型的数组的下一个元素,必须要指针加sizeof(datatype)
int data[]; 则&data[0] 与 data 是等价的
6、遍历数组的一种方式采用ptr++
for ( i = 0 ; i < 10 ; i++)
printf("%d\n",*ptr++);
7、只能利用指针将数组传递给函数,编写以数组作为参数的函数时,比较灵活的一种方案是,需要给函数传递2个参数:指向第一个元素的指针和指定数组中元素数目的个数。
8、任何类型的指针都可以赋给void类型的指针变量,但将void类型的指针赋给其他类型的指针时必须使用强制类型转换,如
void *pv;
pi=(int *)pv;
9、切记要对指针进行初始化:不带方括号的数组名是个指针
struct msg {
char p1[30]; /* p1就是指针,且明确初始化了 */
char *p2; /* 此指针未初始化,没有明确指向 */
} myptrs;
strcpy(myptrs.p2,"slkdjflskdfj"); /* wrong!!! */
puts(myptrs.p2);
10、计算机内存中,所有的data都是以数值方式存储的,ascii码中每个大小写字母、符号或数字都对应一个0-255的值,标准ascii码最大值127,编码128-255是扩展ascii码,表示的是特殊字符,对于标准的可以用char变量来存储,对于扩展的ascii编码,必须使用unsigned char 变量
11、创建字符常量:#define EX 'x' 或 const char A = 'z';
12、声明字符串:char string[10] = {'A','B','C','D','\0' };
char string[10] = "ABCD";
务必保证结尾是\0,如果遗漏所导致的错误会是个非常麻烦的bug
13、一个字符串如何获得内存存储空间,有2个方案:一是程序编译时,为字面字符串分配空间;另一种是在程序执行时,使用malloc()来分配空间,这种称为动态分配
/* 编译时分配空间 */
char *message = "Great Caesar\'s Ghost" 指针message被初始化为指向该字符串的第一个字符
char message[] = "Great Caesar\'s Ghost" 与上面等价
/* malloc()是c对一个内存分配函数,调用时,将需要分配的字节数传给它,malloc()找到并保留一个所需大小的内存块,并返回第一个字节的地址,返回类型是void;如果malloc()无法分配所需内存,则返回null */
#include
void *malloc(size_t size)
14、指向结构的指针常备用于链表中,由于指针必须要有对象可指,所以必须要指定结构的一个实例,这样指向的才是这个实例存储的第一个地址
15、如果p_str是指向结构str的指针,则下面三个表达式是等价的
str.memb (*p_str).memb p_str->memb
16、结构声明:struct data
{
int a;
char b[10];
} c;
共同体声明:union data
{
int a;
char b[10];
} c;
17、全局变量如果没有显式赋值,默认会被编译器初始化为0。局部变量一定要初始化
18、普通全局变量,所在文件可以引用,同时也可以被其他文件引用
静态全局变量,只能被所在文件内引用
19、register寄存器变量,只是“请求”,不是“命令”,变量可能存在与寄存器中,可能存在于内存中;另这种声明只能存储简单的数值变量,不能存储数组与结构,不能静态,不能外部,不能被指针指向!
20、死循环示例:while(1) { }
for(;;) { }
do { } while(1);
21、break只是跳出当前代码段,并不是所有循环体,要退出整个程序,应该调用exit函数,包含于头文件stdlib.h,如exit(EXIT_SUCCESS),exit(EXIT_FAILURE)
22、system(command)函数,包含于头文件stdlib.h,command可以是一个字符串常量,也可以是一个指向字符串的指针。
23、文本流只包含字符,被组织成行,每行最多255字符,以换行符结尾,部分字符有特殊含义
二进制流能处理各种类型的数据,只按原来的样子被读写,无任何特殊方法转换或解释
24、EOF是stdio.h中定义的一个符号常量,值为-1
25、缓冲时,仅当用户按下enter键后,输入才被发送给程序;不缓冲时,用户按键后相应字符就被发送给程序;回显时,输入被发送到stdout,不回显时则不会;getchar()缓冲且回显,getch()不缓冲不回显
26、用户按下Enter键后,键盘设备发送一个回车给stdin,对输入进行缓冲的函数如getchar()会自动把这个回车转换为'/n',而对输入不进行缓冲的函数如getch()会把这个回车转换为'/r'
27、getc()和fgetc()不会自动使用stdin,需要程序制定输入流,他们主要用于从磁盘文件中读取字符
28、scanf()总使用stdin,而fscanf()可以指定输入流,通常用于读取磁盘文件
29、scanf()中,%[] ,这个参数的意义是读入一个字符集合,[ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在此集合的字符便停止. 如果集合的第一个字符是"^", 这说明读取不在"^" 后面集合的字符,既遇到"^"后面集合的字符便停止.注意此时读入的字符串是可以含有空格的.
30、putchar('c')与fputc('c',stdout)是等价的
31、printf()与fprintf()几乎相同,前者将输出发送给stdout,后者可以指定输出流,fprintf()通常将数据输出到磁盘文件中。
printf("%lld",x);
char *fmt = "sdfsdf %f" ;
printf(fmt,x);
等价于 printf("sdfsdf %f",x);
%后接
- 左对齐
+ 对有符号数,左边加+号
在正数的前面加上空格
# 用于转换字符x X或o。表示对非0数字,在前面加上0X、0x(对于x和X)或0(对于o)
n 对应的后面的参数为int指针,做的事情是把当前printf的输出的字符数赋给该变量
32、一个好的习惯是创建自己的error_message()函数来提高代码的结构化程度和可维护性
void error_message(char *msg)
{
fprintf(stderr,msg);
}
调用:error_message("An error has occured");
33、unget()只可以回复1个字符,且无法把EOF字符放入到输入流中
34、stderr不能被重定向,它总是对应于屏幕,stdout可以重定向到其他设备,如printer
阅读(2323) | 评论(0) | 转发(0) |