关于C/C++的一些讨论
2014-11-11 17:59
169 查看
#include"string.h" #include"malloc.h" void swap(int a,int b) { int temp; temp=a; a=b; b=temp; } int get_int(int a) { int i=1+a; return i; } char* get_memory0() { char* p=(char*)malloc(sizeof(char)*20); strcpy(p,"hello world"); return p; } char* get_memory1() { char* p="hello world"; return p; } char* get_memory2() { char p[]="hello world"; return p; } void main() { int x=4,y=3; swap(x,y); int z=x-y; printf("z=%d\n",z);//问题1 z=get_int(z); printf("z=%d\n",z);//问题2 char* c0 = get_memory0(); printf("c0=%s\n",c0);//问题3 const char* c1=get_memory1(); printf("c1=%s\n",c1);//问题4 char* const c2=get_memory2(); printf("c2=%s\n",c2);//问题5 c1=c2; //6 *c1=*c2; //7 c2=c1; //8 *c2=c1; //9 }
C语言的核心:函数、变量和指针
栈:通常是用于那些在编译期间就能确定存储存储大小的变量的存储区,用于在函数作用域内创建、在离开作用域后自动销毁的变量的存储区,是连续的。两个紧挨着定义的变量,存储空间也是紧挨着的。栈的大小有限制。
堆:在编译期间不能确定大小的存储区,存储空间是不连续的,一般由malloc()或new()来分配内存块,并且需要用free()或delete()来释放内存。如果没有释放掉,就会出现内存泄露问题。两个紧挨着定义的指针变量所指向的malloc出来的两块内存不一定是紧挨着的,大小几乎不受限制。
全局/静态存储区:在整个程序运行期间都可见的全局变量和静态变量。
常量存储区:存储区内的常量也是全局可见的,它们里面存放的是常量,不允许被修改。
每个运行程序都拥有自己的运行时"栈",所有的函数都会在运行时从程序栈上得到分配给他的一块存储区。随函数开始而开始,随函数结束而结束,函数结束后这块存储区就自动释放。
参数传递,就是系统用函数实参来初始化函数参数存储区的过程。
参数传值和参数传址。
对函数返回值的理解。函数的返回值有传值和传址两种。参数的返回参数怎么能是一个局部变量呢?局部变量不是在离开作用域后就被自动销毁了么?返回值是传值的函数会在函数返回处产生一个临时变量,用来存放要返回的局部变量的一份拷贝。
临时变量是没有名称的,它的值(右值)会存储在调用者的“栈”中,在函数返回时作为右值赋给左值。
程序的第21行表示分配一块堆内存并使得变量P指向这块堆内存,22行表示往p所指向的堆内存中复制字符串,23行表示p的左值是一个局部指针,存储于函数的栈上,右值是堆的地址值是“hello world",字符串存储于常量存储区。
函数char * get_memory()是一个返回值是传指针的函数。
通常,变量的意义在于,它给一块内存存储区提供了名字,方便程序对这块内存进行读写。变量包含两个值,左值和右值。左值是内存存储区的名字,右值是存储在存储区中的值。
问题5,c2=未知。
常量指针:指向常量的指针,指针所指向的地址的内容是不可修改的。如char const *p;7是错误的。
指针常量:指针的常量,它是不可改变地址的指针,但是可以对它所指向的内容进行修改。如char *const p;8是错误的。
相关文章推荐
- C++中关于console光标的一些小心得,供新手们一起讨论。轻喷。我是个小菜鸡
- More Effective C++议题【六】:关于自增、自减操作符的一些讨论
- 关于C和C++一些大神们的讨论
- 关于C和C++一些大神们的讨论
- 关于C++中类与对象的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于C++泛型编程的一些杂感
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(3) ambushaa [翻译] [转]
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(1) ambushaa [翻译] [转]
- 关于C++的一些细节[四:循环,分支语句,关系表达式,关系运算符]
- 关于C++的一些细节[一]
- 关于Matlab,C/C++和Java之间的一些想法
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(4) ambushaa [翻译] [转]
- 蛙蛙推荐:关于开发规范的一些讨论.doc
- 关于C++的一些细节[五:函数-基础]
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(2) ambushaa [翻译] [转]
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于C/C++程序的一些规范(2005-5-10)