farfar 发表于 2014-7-11 11:24:33

请教,C语言指针是否有静态指针这一概念?

请教各位高手是否有静态指针这么个东东?例如:我希望在一个函式中定义一个指针,但希望这一指针在退出函式后一直占用不被释放,不知该如何操作?
static int *Var; //这个?
无法定义类似:int *static Var;这样的变量,会报错。
但又不想定义全局变量,请大家出出主意,谢谢大家!

lubing521 发表于 2014-7-11 11:45:42

static int *p;

qlb1234 发表于 2014-7-11 12:05:13

指針其實不是一箇類型。
靜態是肯定可以靜態,但能不能叫做靜態指針就難說了,關鍵是看看可不可以滿足你的需要。
#include <stdio.h>

int a;

void func(void)
{
    static int * p = a;
    printf("%i\n", *p);
    ++p;
}

int main(int argc, char * argv[])
{
    a = 0;
    a = 1;
    a = 2;
    a = 3;
    a = 4;

    func();
    func();
    func();
    func();
    func();

    return 0;
}

gcc a.c
a.exe
0
1
2
3
4

sbusr 发表于 2014-7-11 12:08:47

2L正解。
函数体内部定义的变量为局部变量,如int a; int * b; 指针变量也是变量。
在变量定义前加static将其定义为静态局部变量,其占用的内存空间在编译时确定地址,在运行期间,函数调用完成后也不会被其它变量占用。

farfar 发表于 2014-7-11 13:03:06

lubing521 发表于 2014-7-11 11:45
static int *p;

谢谢您的回复。
不确定用static int *可以确保指针式静态的,也没有资料提到可以确保指针式静态的。

farfar 发表于 2014-7-11 13:06:25

qlb1234 发表于 2014-7-11 12:05
指針其實不是一箇類型。
靜態是肯定可以靜態,但能不能叫做靜態指針就難說了,關鍵是看看可不可以滿足你的 ...

谢谢qlb1234
此句:static int *p = a;
只能确保对象是静态的,但无法保证指针也是静态的。另外,在某些编译器下可能会在此句得到一个类型不匹配的警告。

farfar 发表于 2014-7-11 13:12:08

sbusr 发表于 2014-7-11 12:08
2L正解。
函数体内部定义的变量为局部变量,如int a; int * b; 指针变量也是变量。
在变量定义前加static将 ...

谢谢sbusr
虽然qlb1234的测试程式可以正确运行,但似乎不能说明指针变量不会被占用。可能的一种情况是工程占用RAM少的时候指针变量不会被占用,单如果工程占用的RAM比较多的时候应该是无法保证的。
虽然静态变量的地址是静态的,但是无法保证指向他的指针也是静态的,因为指针不是全局指针。

qlb1234 发表于 2014-7-11 13:18:37

只能确保对象是静态的
虽然静态变量的地址是静态的,但是无法保证指向他的指针也是静态的
不懂。你究竟想讓甚麼保持靜態?
加上static的變量,其存放的地方不會發生變化,亦不會重複被初始化。就這樣。
加上const的變量,他的值不能被改變。

takashiki 发表于 2014-7-11 13:57:35

你的意思是var是静态的,*var也是一直占着茅坑的?那这样:static int* var = (int*)malloc(100),只要你不手动free擦PP,就一直占着茅坑。

farfar 发表于 2014-7-11 14:21:07

本帖最后由 farfar 于 2014-7-11 14:26 编辑

qlb1234 发表于 2014-7-11 13:18
不懂。你究竟想讓甚麼保持靜態?
加上static的變量,其存放的地方不會發生變化,亦不會重複被初始化。就 ...

"虽然静态变量的地址是静态的,但是无法保证指向他的指针也是静态的,因为指针不是全局指针。"此句应该为:"虽然静态变量的地址是静态的,但是无法保证指向他的指针变量也是静态的,因为指针不是全局指针。"
可能是我描述得不清晰。是这样的,希望在一个非main函式内定义的指针是静态的,这样在下次访问该变量时该指针还是指向最后赋值的变量。

farfar 发表于 2014-7-11 14:22:46

takashiki 发表于 2014-7-11 13:57
你的意思是var是静态的,*var也是一直占着茅坑的?那这样:static int* var = (int*)malloc(100),只要你不 ...

不错,这也是一个好办法,谢谢!

qlb1234 发表于 2014-7-11 14:26:20

farfar 发表于 2014-7-11 14:21
可能是我描述得不清晰。是这样的,希望在一个非main函式内定义的指针是静态的,这样在下次访问该变量时该 ...

在一个非main函式内定义的指针是静态的,这样在下次访问该变量时该指针还是指向最后赋值的变量。
甚麼變量?
在那裏賦值?
甚麼變量?

farfar 发表于 2014-7-11 14:29:16

本帖最后由 farfar 于 2014-7-11 14:30 编辑

qlb1234 发表于 2014-7-11 14:26
在一个非main函式内定义的指针是静态的,这样在下次访问该变量时该指针还是指向最后赋值的变量。
甚麼變 ...

就是要确保该指针变量指向的对象不改变,而不会像局部变量一样被系统回收。

qlb1234 发表于 2014-7-11 14:31:32

farfar 发表于 2014-7-11 14:29
就是要确保该指针变量指向的对象不改变,不会像局部变量一样被系统回收。 ...

指針衹存放一箇地址。至於這箇地址裏有甚麼,指針是無權決定的。
或許你需要的是一箇static變量。這箇變量本身是static的,這樣地址就不會變。

farfar 发表于 2014-7-11 14:34:55

qlb1234 发表于 2014-7-11 14:31
指針衹存放一箇地址。至於這箇地址裏有甚麼,指針是無權決定的。
或許你需要的是一箇static變量。這箇變 ...

不错,这又是一个好方法,非常感谢!

farfar 发表于 2014-7-11 14:38:11

基本上可以结帖了,非常感谢qlb1234以及各位热心坛友的帮助,谢谢大家!
页: [1]
查看完整版本: 请教,C语言指针是否有静态指针这一概念?