##### 指针
- 指针
- **指针**是一个变量, 它存储另一个变量的[[C.内存地址|内存地址]], 指针可以指向变量, 数组, 函数甚至其他指针. 通过指针可以直接访问和修改该地址上的数据, 用[[C.空指针|空指针]]表示无效地址
- 语法
- [[C.指针声明|指针声明]]
- [[C.标量初始化|标量初始化]]
- [[C.指针操作表达式|指针操作表达式]]
- 示例
```c
#include <stdio.h>
// 定义一个结构体
struct MyStruct {
int a;
double b;
char c;
};
// 定义一个联合体
union MyUnion {
int x;
double y;
char z;
};
// 定义一个枚举
enum MyEnum {
VALUE_ONE,
VALUE_TWO,
VALUE_THREE
};
// 定义一个函数
void myFunction() {
printf("This is a function.\n");
}
int main() {
// 基本类型
int integer = 42;
float floating = 3.14f;
double double_floating = 2.71828;
char character = 'A';
// 派生类型
int array[5] = {1, 2, 3, 4, 5};
int *pointer = &integer;
// 结构体、联合体和枚举
struct MyStruct my_struct = {1, 3.14, 'C'};
union MyUnion my_union = {.x = 42};
enum MyEnum my_enum = VALUE_TWO;
// 获取函数指针
void (*func_ptr)() = myFunction;
// 输出各类型的内存大小和地址
printf("Integer: size = %zu bytes, address = %p\n", sizeof(integer), (void *)&integer);
printf("Float: size = %zu bytes, address = %p\n", sizeof(floating), (void *)&floating);
printf("Double: size = %zu bytes, address = %p\n", sizeof(double_floating), (void *)&double_floating);
printf("Char: size = %zu bytes, address = %p\n", sizeof(character), (void *)&character);
printf("Array: size = %zu bytes, address = %p\n", sizeof(array), (void *)array);
printf("Pointer: size = %zu bytes, address = %p, points to = %p\n", sizeof(pointer), (void *)&pointer, (void *)pointer);
printf("Struct: size = %zu bytes, address = %p\n", sizeof(my_struct), (void *)&my_struct);
printf("Union: size = %zu bytes, address = %p\n", sizeof(my_union), (void *)&my_union);
printf("Enum: size = %zu bytes, address = %p, value = %d\n", sizeof(my_enum), (void *)&my_enum, my_enum);
printf("Function: address = %p\n", (void *)func_ptr);
return 0;
}
```