C和指针读后笔记

注释:

#if 0

statements

#endif

从逻辑上删除一段代码或者注释。

编程练习:编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面要加行号。在编写这个程序时要试图让程序能处理的输入行的长度没有限制。

#include <stdio.h>


#include <stdlib.h>


int main()
{
int ch;
int line;
int at_beginning;


line = 0 ;
at_beginning = 1 ;
/*
**读取字符并逐个处理它们
*/
while ( (ch = getchar()) != EOF )//键盘输入EOF:ctrl+Z
{


if ( at_beginning == 1 )
{
at_beginning = 0 ;
line += 1 ;
printf("%d:",line);
}


//打印字符,并对结尾进行处理
putchar(ch) ;
if ( ch == '\n' )
{
at_beginning = 1 ;


}


      


}
return 0 ;
}


字符串常量:字符串常量实际上是个指针。
已知字符串常量"xyz" ,
"xyz"+1 代表:字符串中的第二个字符:y
*"xyz"代表:字符串的第一个字符:x
"xyz"[2]代表:字符串的第三个字符:z

(1)神秘的函数
//参数是一个0~100的值
#include <stdio.h>
void mystery(int n)
{
n += 5 ;
n /= 10 ;
printf( "%s\n" ,"**********" + 10 - n );
//字符串常量最后一个字符其实是'\0'.
}

参数为0 ,打印0个星号
参数为100,打印10个星号。

(2)putchar ("0123456789ABCDEF"[value%16] ) ;
10进制转换为16进制部分代码。



#include <stdio.h>


#include <stdlib.h>
#if 0
(1) 宏替换
#endif


//只有当字符串常量作为宏参数给出时才能使用。
#define PRINT(FORMART,VALUE) \
printf ( "The value is " FORMART "\n" , VALUE)


//#argument 这种结构被预处理器翻译为“argument”。
#define PRINT1(FORMART,VALUE) \
printf("The value of " #VALUE \
" is " FORMART "\n" , VALUE)




#if 0
(2) 宏与函数
宏是与类型无关的,有一些任务根本无法用函数实现。
#endif


#define MALLOC(n,type) \
( (type*)malloc( (n)*sizeof(type)) )


typedef struct Node
{


int number;
char ch ;
}Node;




#if 0
(3) 带副作用的宏
当宏参数在宏定义中出现的次数超过一次时,如果这个参数具有副作用,将会出现不可预料的结果。
#endif


#define MAX(a,b)  ( (a) > (b) ? (a) : (b) )


#if 0
(4) 防止头文件多重包含
#endif


#ifndef  _HEADERNAME_H
#define _HEADERNAME_H 1
/*
头文件中的内容
*/
#endif


int main()
{

int x= 3 ;
PRINT("%d",x*3);
PRINT1("%d",x*3);


Node *p = MALLOC(3,Node); //申请一个大小为3个Node的空间
p[2].number= 3;
p[2].ch='a';
PRINT("%d",p[2].number);
PRINT("%c",p[2].ch);




int a = 5 ;
int b = 6 ;
int c = MAX(a++,b++);
PRINT1("%d",a);//6
PRINT1("%d",b);//8
PRINT1("%d",c);//7


return 0 ;
}



(1)调试用的printf,后应该加fflush(stdout),立即输出到屏幕上,因为printf结果是先写入缓冲区中。

你可能感兴趣的:(C和指针读后笔记)