您的位置:首页 > 编程语言

实例化代码

2016-03-16 10:11 204 查看
/*

虽然学过的C语言但是还是有些东西没遇到过

带你见识下不知道的东西:

*/

#include <stdio.h>

#define NUMBER 5

/*

define: 宏定义

后面的变量名用大写

编译时进行字符串自动替换也就是将文件内的NUMBER替换为5

typedef 为现有的数据类型起个别名

如typedef int int_wy--->那么int_wy就是代表的int类型

*/

int array[NUMBER];

int main()

{

int i=9;

//1

//puts一般用于显示不需要格式化输出的时候

puts("用过吗?");//"用过吗?"+i-->这样再试试

puts("用过吗?"

"这么会吗?");

//2

printf("他可发出响声:\a\a\a \n");

//3

putchar('\n');

//4

extern int array[];/*这个实际是没用的因为在之前已经声明了array数组了

这里不是定义array数组 extern 表示试用某处创建的数组*/

//5

/*

static 定义的对象是静态存储期,在main执行之前的准备阶段就被创建出来的,

程序结束的时候才会消失

*/

//6字符串

/*

字符串在C++里面是直接用string就行的,c中用字符数组的形式表示的

*/

char str[]="wangyang";

printf("%s\n",str);

char *p;

/*

这里明明是写的指针但是p在下面我没有直接用*p的形式但是这样完全可以

这里涉及到内存中的存储问题:

我粗略的说一下:

数组的存储应该是这样的,数组在栈中存储的是地址值

而不是真正的数据值,数据值存在内存中的堆中,我把str赋值给p那么p中的值

就是str[0]的地址值,访问时为什么这样就行呢?

p[1]相当于在str[0]的地址值基础上加了1(这里的是char类型所以应该是1)

加了1之后的地址就是str[1]的地址也就是p[1]就可以访问str[1]的数据

注:

在这里str的地址值就是指向了堆中的数据值,所以通过地址值即可获得他的值

*/

p=str;

printf("%c\n",p[1]);

//7

//注意下面这个问题

//*p=&str;

//cannot convert from 'char (*)[9]' to 'char'

p=&str[0];//&运算符得到str的地址,p的值是地址,*p则是他的值

printf("%c\n",p[1]);

printf("%s\n",p);//输出整个字符串的值

char *q=&str[0];//p=str;这两句效果是一样的

/*

这里注意一下啊:(与上面的错误进行对照)

*在这里的意义并不是代表指针对象本身,而是他的存在就表示这个变量是一个指针

有点像变量类型那个意思,这里q的数据类型应该是char *

*/

printf("%c\n",q[1]);

printf("%c\n",*(q+3));//取出来的值应该是g-->str[3]-->q[3]

//8整数

int *m,a=10;

m=&a;

printf("%d\n",*m);

*m=100;

printf("%d\n",*m);

return 0;

}

[cpp] view
plain copy







打开你的编译器include目录中的ostream.h文件,你就回看到类似的如下代码:

... ...

... endl(ostream& os) { os << '\n' << flush; }

... ...

也就是说,endl比'\n'要多了一个“刷新”流里的缓冲的flush操作。

以文件输出流(ofstream)为例:当流的缓冲区未满时,写入'\n'的是不会马上写到文件里的,但执行endl会“强行”把缓冲区的内容写入文件中。所以,endl不仅换行,还刷新流缓冲。

iostream在这里耍了个小技巧,重载<<操作符"<<((ostream& *f)(ostream&))",使得当你执行"<< endl"时,其实调用了endl()函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: