C++指针二(易错模型)
规则一:Main(主调函数)分配的内存(在堆区,栈区、全局区)都可以在被调用函数里使用。如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的。
#include "stdio.h" #include "stdlib.h" #include "string.h" char * getstring1() { char *p1 = "abcde"; return p1; } char * getstring2() { char *p2 = "abcde"; return p2; } char * getstring3() { char buf[30]; strcpy(buf, "abcde"); return buf; } void main() { int i= 0; //指针指向谁就把谁的地址赋给指针变量。 char *p1 = getstring1(); char *p2 = getstring2(); char ******* p3 = NULL; //p3 是个变量 // printf("p1:%s\n", p1); // printf("p2:%s\n", p2); // // printf("p1:%d\n", p1); // printf("p2:%d\n", p2); printf("p4:%s\n", p4); //指针变量和它所执行的内存空间变量是两个不同的概念 strcmp(p1, p2); system("pause"); }
规则二:间接赋值,注意内存冲突。
#include "stdio.h" #include "string.h" #include "stdlib.h" //看见一级指针,要去分辨指针的输入输出特性 //指针的输入特性:在主调函数里面分配内存,在被调用函数里面使用 //指针的输出特性:在被调用函数里面分配内存,主要是把运算结果甩出来 int getLen3(int *p /*in out*/) { //*(NULL) = 40; //*(0) = 40; *p = 40; //间接赋值 如果p是a的地址,那么就间接的修改a的值 //*p形参,去间接的修改实参的值 } void main() { int a = 10; //定义了一个变量(实参)//a看成0级指针 int * p = NULL; ////定义了一个变量(形参)//1级指针 a = 20; //直接修改a的值 printf("a:%d \n", a); //p = &a; //a的地址赋给p //把一个变量去地址传给另外一个变量 //实参取地址传给形参 getLen3(p); getLen3(NULL); printf("a:%d \n", a); system("pause"); }
//*(NULL) = 40; //*(0) = 40;
getLen3(NULL);
不同的编译器会有不同的提示。地址为为零的内存空间归系统所以,程序修改里面的内容,会出错。
posted on 2015-07-12 09:11 CentForever 阅读(412) 评论(0) 编辑 收藏 举报