C语言中的全局变量和静态变量在内存中拥有固定的存储空间和生命周期,对于指针类型的全局和静态变量,也有类似的特点。下面我将详细讲解C全局和静态指针的完整使用攻略,包括定义、声明、初始化和使用两个示例。
1. 定义和声明全局和静态指针变量
我们可以在程序中定义和声明全局指针变量和静态指针变量。
1.1. 定义全局指针变量
全局指针变量定义格式如下:
<type> *<pointer_name>;
其中,<type>
是指针指向的数据类型,<pointer_name>
是指针变量的名称。
示例:
int *global_ptr; // 定义int类型的全局指针变量
1.2. 声明全局指针变量
通过在头文件中定义全局指针变量,可以在整个程序中使用该指针变量。
示例:
// global.h
extern int *global_ptr; // 声明全局指针变量
// global.c
#include "global.h"
int *global_ptr; // 定义全局指针变量
1.3. 定义静态指针变量
静态指针变量定义格式如下:
static <type> *<pointer_name>;
其中,<type>
是指针指向的数据类型,<pointer_name>
是指针变量的名称。
示例:
static int *static_ptr; // 定义int类型的静态指针变量
1.4. 声明静态指针变量
通过在头文件中定义静态指针变量,可以在整个程序中使用该指针变量。
示例:
// static.h
static int *static_ptr; // 声明静态指针变量
// static.c
#include "static.h"
static int *static_ptr; // 定义静态指针变量
2. 初始化全局和静态指针变量
在定义和声明全局和静态指针变量后,我们需要对它们进行初始化。
2.1. 全局指针变量的初始化
全局指针变量在定义时默认初始化为NULL,也可以手动初始化。
示例:
int *global_ptr = NULL; // 定义并初始化全局指针变量
2.2. 静态指针变量的初始化
静态指针变量需要手动初始化。
示例:
static int *static_ptr = NULL; // 定义并初始化静态指针变量
3. 使用全局和静态指针变量的示例
下面我们通过两个示例来演示全局和静态指针变量的用法。
3.1. 示例1:全局指针变量
#include <stdio.h>
int *global_ptr; // 定义全局指针变量
int main() {
int num = 10;
global_ptr = # // 赋值为num变量的地址
printf("num的地址为:%p\n", &num);
printf("global_ptr指向的地址为:%p\n", global_ptr);
printf("*global_ptr的值为:%d\n", *global_ptr);
return 0;
}
输出:
num的地址为:0x7ffce80c36d0
global_ptr指向的地址为:0x7ffce80c36d0
*global_ptr的值为:10
3.2. 示例2:静态指针变量
#include <stdio.h>
static int *static_ptr = NULL; // 定义静态指针变量
void func() {
static int num = 20;
static_ptr = # // 赋值为num变量的地址
printf("num的地址为:%p\n", &num);
printf("static_ptr指向的地址为:%p\n", static_ptr);
printf("*static_ptr的值为:%d\n", *static_ptr);
}
int main() {
func();
func();
func();
return 0;
}
输出:
num的地址为:0x100002018
static_ptr指向的地址为:0x100002018
*static_ptr的值为:20
num的地址为:0x100002018
static_ptr指向的地址为:0x100002018
*static_ptr的值为:20
num的地址为:0x100002018
static_ptr指向的地址为:0x100002018
*static_ptr的值为:20
在本示例中,静态指针变量用于存储静态变量的地址,并在函数调用时被多次使用,达到了变量共享的目的。这种用法被称为“静态变量的共享指针”技术。