实例化代码
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()函数。
虽然学过的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()函数。
相关文章推荐
- 面向对象编程进阶和字符串
- java 编程思想 笔记摘录
- Spring整合Hibernate详细步骤
- c实现各种进制间转换
- Java Socket编程
- Java NIO系列教程(二) Channel
- Spring AOP 注解添加操作日志
- Python,pymysql简单使用。
- Java对象的强、软、弱和虚引用(二)
- 解决:ubuntu下eclipse的maven项目报错:Maven Dependencies
- Java NIO系列教程(一) Java NIO 概述
- C语言+嵌入式SQL+DB2开发经验总结
- 用sae新浪云,mao10cms怎样用php连接mysql???
- JAVA中 成员变量和和实例变量一样吗?
- Github资源汇集
- Java并发编程:Thread类的使用
- struts2拦截器
- <转> Lua使用心得(2)
- 怎样在iis中发布asp.net网站
- C++设计模式——单例模式 系列