随笔分类 - C/C++
摘要:利用C的预处理程序有条件地包含或不包含检查部分
阅读全文
摘要:例9:
char s='a';
int *ptr;
ptr=(int*)&s;
*ptr=1298;
指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。
阅读全文
摘要:如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*, 那么语法格式是:
(TYPE*)p;
这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。
一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。
例7:
void fun(char*);
int a=125, b;
fun((char*)&a);
...
...
void fun(char *s)
{
char c;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int
阅读全文
摘要:可以声明一个指向结构类型对象的指针。
例5:
structMyStruct
{
int a;
int b;
int c;
}
MyStruct ss={20,30,40};
//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct*ptr=&ss;
//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。
int*pstr=(int*)&ss;
//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。
阅读全文
摘要:数组的数组名其实可以看作一个指针。看下例:
例2:
intarray[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可写成:value=*array;
value=array[3];//也可写成:value=*(array+3);
value=array[4];//也可写成:value=*(array+4);
上例中,一般而言数组名array代表数组本身,类型是int[10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int*,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。
阅读全文
摘要:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:
[1]指针的类型,
[2]指针所指向的类型,
[3]指针的值或者叫指针所指向的内存区,
[4]还有指针本身所占据的内存区。 --sizeof(指针变量名) 一般32位机都为4;
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。
阅读全文
摘要:优秀的代码风格如同一身得体的打扮,能够给人以良好的印象。
初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格。本文就代码风格中的几个重点问题进行了讨论,并在文后给出了一份优秀的代码作为风格模板。代码风格不必花费太多专门的时间研究,在使用中不断模仿模板代码,轻轻松松就能写出“专业的代码”。
阅读全文
摘要:栈:后进先出 允许插入和删除的一端叫栈顶top 不允许的一端叫栈底bottom
主要操作:进栈、出栈、判断栈满和栈空
有两个现成的函数 int push(int s[],int x,int *ptop), int pop(int s[],int *py,int *ptop) 直接拿过来用就行 要压入的栈空间 要进栈的数 栈顶指针
队列:先进先出 允许插入的叫队尾rear 允许数据离开的叫队头front
主要操作:入队、出队、判断队满和队空
有两个现成的函数 int EnQueue(int *Q,int x,int *pf,int *pr) pf:队头指针
直接拿过来用就行 int DeQueue(int *Q,int *py,int *pf,int *pr) pr:队尾指针
Q:要进入的队空间 x:要进入队的数 py:要出队的数
阅读全文
摘要:操作系统中对文件的操作主要包括:
打开、关闭、读、写、 定位等操作
所用到的库函数主要包括:
文件打开函数: fopen
文件关闭函数: fclose
字符读写函数: fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:freed和fwrite
格式化读写函数:fscanf和fprinf
随机读写函数: rewind 函数和fseek函数
阅读全文
摘要:malloc与free使用时的注意事项:
1)配对使用,有一个malloc,就应该有一个
free
2)尽量在同一层上使用,不要出现malloc在函
数中,而free在函数外。最好在同一调用层上
使用这两个函数
3)malloc分配的内存一定要初始化
free后的指针不允许再使用
阅读全文
摘要:strlen原型:int strlen(const char *str)
功能:返回字符串的实际长度,不含’\0’
strcpy原型:char *strcpy(char *dest,const char *src)
功能:把src所指向的以\0结尾的字符串复制到dest所指向的数组中(含n,代表只拷贝前n个)
阅读全文
摘要:Int *p = &a 等价于
int *p;
p=&a;
相当于 (int *) p = &a
二维数组的指针是难点,如何区分元素的地址和元素的值。
函数的指针: int (*pf)(); 指向函数的指针,存放的是函数的地址
int *ap(int x,int y) 指针型函数,返回值是指针指针类型
阅读全文
摘要:带参数的宏与带参函数的区别:
①函数调用时,先求实参表达式值,再代入行参,而宏只是简单的替换,并不求值;
②函数调用在程序运行时分配内存,而宏展开时并不分配内存,也没有返回值的概念;
③函数中的实参和行参都要定义类型,而且要求一致,宏名无类型,其参数也没有类型;
④宏替换不占运行时间,只占编译时间,而函数调用占运行时间
阅读全文
摘要:C语言概述、数据类型、运算表达式、程序结构
关键字 volatile
float型: 占4字节,7位有效数字
Double型: 占8字节,15~16位有效数字
阅读全文