交换函数指针变量的基本形式
*
表示指针运算符。p
是一个指向int
类型变量的指针。int *p;
交换函数
void Swap(int *a, int *b) {
int *t; // 临时指针
*t = *a;
*a = *b;
*b = *t;
}
指针的运算和操作
- 通过指针变量中的值找到存储单元。
- 从指定地址向后偏移对应的字节数(与基类型相关)。
- 指针运算的结果是另一个变量的地址,或指针本身的值。
空指针和数组指针
NULL
空指针NULL
是一个预定义的宏,表示空指针。空指针不指向任何有效内存地址,用于指针初始化和错误检查。- 数组名是数组元素地址的常量,其本质是一个指针常量。
-
int main(void) { int i = 1; char *p = (char*)&i; // 强制类型转换 if (*p == 1) { printf("little\n"); } else { printf("big\n"); } return 0; }
用于判断机器的字节顺序(大小端模式)。
C 语言中,指针加 1 后,指针的值会增加一个步长,该步长取决于指针所指向的数据类型的大小。下面是详细解释及示例。
指针加 1 的内存地址变化
指针运算符 +
会根据指针指向的数据类型移动指针。如:
- 对于
int
指针,加 1 会使指针增加 4 个字节(假设int
类型占 4 个字节)。 - 对于
char
指针,加 1 会使指针增加 1 个字节(char
类型占 1 个字节)。 - 对于
double
指针,加 1 会使指针增加 8 个字节(假设double
类型占 8 个字节)。
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 指向数组的首元素
printf("原始指针地址: %p\n", (void*)p);
p = p + 1;
printf("加 1 后的指针地址: %p\n", (void*)p);
printf("加 1 后的值: %d\n", *p);
char c_arr[5] = {'a', 'b', 'c', 'd', 'e'};
char *cp = c_arr; // 指向字符数组的首元素
printf("原始字符指针地址: %p\n", (void*)cp);
cp = cp + 1;
printf("加 1 后的字符指针地址: %p\n", (void*)cp);
printf("加 1 后的字符值: %c\n", *cp);
double d_arr[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
double *dp = d_arr; // 指向双精度浮点数数组的首元素
printf("原始双精度指针地址: %p\n", (void*)dp);
dp = dp + 1;
printf("加 1 后的双精度指针地址: %p\n", (void*)dp);
printf("加 1 后的双精度值: %lf\n", *dp);
return 0;
}
原始指针地址: 0x7ffeefbff590
加 1 后的指针地址: 0x7ffeefbff594
加 1 后的值: 2
原始字符指针地址: 0x7ffeefbff580
加 1 后的字符指针地址: 0x7ffeefbff581
加 1 后的字符值: b
原始双精度指针地址: 0x7ffeefbff5a0
加 1 后的双精度指针地址: 0x7ffeefbff5a8
加 1 后的双精度值: 2.200000