最近写程序是用到指针,我本来想再一个函数中定义静态指针,以为可以向静态变量一样在每次进入程序时指针

的值可以保持上一次的值,但是结果不对。然后上网查了一下发现静态指针好像不是这么用的,静态指针和全局指针到底与一般的指针有什么区别。

如果一定要用静态指针的话,就把静态变量(如static char *p)声明在文件头部,头文件包含之后,而不是函数中。因为在每次进入函数时静态变量都会被重新定义一次,如果你不对其初始化,则系统每次的分配给它的值都是随机的
全局指针(如extern char *p)作用域是整个工程,即整个工程中不同的文件都可以调用它。一般定义在文件首部,必须在函数之外;
静态指针(static char *p)作用域是一个文件内部,即在文件中定义的各个函数都可以调用它,但其他文件不能调用。一般定义在文件首部,必须在函数之外;
一般指针(char *p)作用域是一个函数内部,即它的定义赋值及使用都在函数内部进行,
当进入函数时,指针被定义;当退出函数时,指针变量就会被删除。定义在函数内部。

另外,无论是extern, static还是一般指针变量,只要是在函数中定义的,它的生存周期都在函数内部,当进入函数时,指针被定义;当退出函数时,无论它是什么类型的指针变量,都会被删除。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-30
用static修饰的全局变量
首先,我要告诉你static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;
其次,static修 饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;
最后,static修饰全局变量的作用域 只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它,如:
test1.h:
#ifndef TEST1H
#define TEST1H
static char g_str[] = "123456";
void fun1();
#endif
test1.cpp:
#include "test1.h"
void fun1()
{ cout << g_str << endl; }
test2.cpp
#include "test1.h"
void fun2()
{
cout << g_str << endl;
}
以上两个编译单元可以连接成功, 当你打开test1.obj时,
你可以在它里面找到字符串"123456", 同时你也可以在test2.obj中找到它们,它们之所以可以连接成功而没有报重复定义的错误是因为虽然它们有相同的内容,但是存储的物理地址并不一样, 就像是两个不同变量赋了相同的值一样,而这两个变量分别作用于它们各自的编译单元。
也许你比较较真,自己偷偷的跟踪调试上面的代码,结果你发现两个编译单元(test1, test2)的g_str的内存地址相同,于是你下结论static修饰的变量也可以作用于其他模块,但是我要告诉你,那是你的编译器在欺骗你,大多数编 译器都对代码都有优化功能,以达到生成的目标程序更节省内存,执行效率更高,当编译器在连接各个编译单元的时候,它会把相同内容的内存只拷贝一份,比如上 面的"123456", 位于两个编译单元中的变量都是同样的内容,那么在连接的时候它在内存中就只会存在一份了, 如果你把上面的代码改成下面的样子,你马上就可以拆穿编译器的谎言:
test1.cpp:
#include "test1.h"
void fun1() { g_str[0] = 'a'; cout << g_str << endl; }
test2.cpp
#include "test1.h"
void fun2()
{ cout << g_str << endl; }
void main()
{
fun1(); // a23456
fun2(); // 123456
}
这个时候你在跟踪代码时,就会发现两个编译单元中的g_str地址并不相同,因为你在一处修改了它,所以编译器被强行的恢复内存的原貌,在内存中存在了两份拷贝给两个模块中的变量使用。
正是因为static有以上的特性,所以一般定义static全局变量时,都把它放在原文件中而不是头文件,这样就不会给其他模块造成不必要的信息污染,同样记住这个原则吧!
第2个回答  2011-11-30
指针是指向一个内存地址的,而一个内存地址可以代表一个变量、结构体、函数、数组等等,也就是那个数据类型整个分配地址的开头的地址
静态指正只是说这个指针无法改变其指向的地址了
而一般的指针可以转向指向其他的地址其他的变量神马神马的
第3个回答  2011-12-04
质量好和不好
相似回答