C语言里面总有你不知道的-(已更新)

来源:互联网 发布:阿里巴巴与淘宝价格比 编辑:程序博客网 时间:2024/05/04 10:22
/*虽然学过的C语言但是还是有些东西没遇到过带你见识下不知道的东西:*/#include <stdio.h>#define NUMBER 5/*define: 宏定义后面的变量名用大写编译时进行字符串自动替换也就是将文件内的NUMBER替换为5typedef 为现有的数据类型起个别名如typedef int int_wy--->那么int_wy就是代表的int类型*/int array[NUMBER];int main(){int i=9;//1//puts一般用于显示不需要格式化输出的时候puts("用过吗?");//"用过吗?"+i-->这样再试试puts("用过吗?""这么会吗?");//2printf("他可发出响声:\a\a\a \n");//3putchar('\n');//4extern 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;}
打开你的编译器include目录中的ostream.h文件,你就回看到类似的如下代码:... ...... endl(ostream& os) { os << '\n' << flush; }... ...也就是说,endl比'\n'要多了一个“刷新”流里的缓冲的flush操作。以文件输出流(ofstream)为例:当流的缓冲区未满时,写入'\n'的是不会马上写到文件里的,但执行endl会“强行”把缓冲区的内容写入文件中。所以,endl不仅换行,还刷新流缓冲。iostream在这里耍了个小技巧,重载<<操作符"<<((ostream& *f)(ostream&))",使得当你执行"<< endl"时,其实调用了endl()函数。


0 0
原创粉丝点击