C/ C++中的静态指针和外部指针

898 阅读4分钟

静态和extern是C语言中的存储类,它们定义了变量的范围和寿命。与C语言中的任何变量类似,我们可以在不同的使用情况下使用这些关键词与指针。

内容表:

  1. C/ C++中的静态指针
  2. C/C++中的外部指针

让我们开始吧。

C/ C++中的静态指针

静态变量一旦被初始化就一直存在,直到程序终止。这些变量即使离开了它们的范围也会保持它们的值。一旦声明和初始化,它们就不会被重新声明,也就是说,一旦内存被分配,它们就会一直存在,直到程序终止。一个静态指针的声明如下所示:

static int * ptr; // A static pointer of type int is defined    

这个声明说,指针本身应该有静态的存储时间,而没有说任何关于指针指向的东西的存储类别。在程序执行过程中,只需给这个指针分配不同的值,就可以在不同的时间改变。

这些变量的范围取决于它们被声明的地方。如果变量是在函数内部声明的,它们的范围就是本地的。如果静态变量是在全局区域内声明的,那么它可以在程序的任何地方或特定的C文件中被访问。编译器会分配一个初始值0或NULL,下面是一个例子:

#include <stdio.h>

void foo(){
int a = 10, b = 20;     
static int *c; //static pointer variable declaration
//re-declaration is not done in case of static variables

if(c == 0)
    c = &a; 
else
    c = &b;

printf("value = %d\n", *c);
printf("address of pointer = %d\n", &c);
printf("address of memory pointed by pointer c = %d\n", c);
printf("address of a = %d\n", &a);
printf("address of b = %d\n", &b);    
}

int main(){
    foo();
    foo();
}    

输出:

value = 10
address of pointer = 4218932
address of memory pointed by pointer c = 6422204
address of a = 6422204
address of b = 6422200
value = 20
address of pointer = 4218932
address of memory pointed by pointer c = 6422200
address of a = 6422204
address of b = 6422200    

在上面的程序中,函数foo()被main()调用。在第一次迭代中,编译器初始化的静态变量包含'0'(零),所以'a'的值将被分配,由于它是静态变量,即使在函数执行完成后也保持这个值。因此,在foo()的第二次迭代中,静态指针'c'被分配给b的值。我们可以在输出窗口中观察到同样的情况。静态指针的地址在整个程序的执行过程中是不变的。但是它所指向的地方可以被修改。

静态指针可以用来实现一个始终向程序返回相同缓冲区的函数,这在串行通信中很有帮助:

char * Buffer(){
static char *buff;

if(buff == 0)
    buff = malloc( BUFFER-SIZE );

return buff;
}

C/C++中的外部指针

Extern存储类指定该变量在大程序中的其他地方定义。通过将一个变量指定为Extern,程序员可以使用一个在其他地方声明的变量,就像在本地声明的一样。Extern变量只不过是一个全局变量,在它被声明的地方用一个合法的值进行初始化,以便在其他地方使用。这些变量只能在全局范围内初始化,而且只能有一次,但是它们可以根据需求被声明任意次数。声明为extern的变量不分配任何内存。

#include <stdio.h>

void foo(){  
int a = 11;
extern int *ptr; 
//specifies compiler to search for this variable outside this function

printf("Default value = %d (NULL pointrer)\n", ptr);
ptr = &a;
printf("After assignment %d\n", *ptr);
}

int main(){
    foo();
}

int *ptr; // Globle pointer declaration
// pointer initialized by compiler - null pointer

输出:

Default value = 0 (NULL pointrer)  
After assignment 11

通过使用Exrern指针,可以创建全局可用的指针,并在不同的情况下发挥作用。它的用途之一是在项目的其他文件或函数中访问主函数的命令行参数:

extern int ArgC = 0;
extern char ** ArgV = 0;

int main( int argc, char ** argv ) {
   ArgC = argc;
   ArgV = argv;
   ...
}

通过OpenGenus的这篇文章,你一定对C/C++中的静态和外部指针有了完整的了解。