指针
- 指针变量保存的是一个十六进制的内存地址编号,通过这个地址我们可以直接操作这个内存
- 声明一个指针:
int* pointer;
//声明一个指针
int* pointer;
//声明一个变量a
int a = 1;
//给指针赋值
pointer = &a;
//指针解引用赋值
*pointer = 3;
数组和指针操作
包含头文件
#include <stdio.h>
数组的地址
打印数组的地址、数组指针指向的地址和数组第一个元素的地址。
int array[4];
// 数组变量指向存储空间的首地址
printf("数组的地址:%p\n", (void *)&array);
printf("数组指针指向的地址:%p\n", (void *)array);
printf("数组第一个元素的地址:%p\n", (void *)&array[0]);
对指针进行加减操作
通过指针操作输入数组元素,并打印数组元素。
// 对指针进行加减操作,使指针指向上一个或下一个存储单元,存储单元的大小由数据类型决定,例如 char 是 1 byte, int 是 4 byte
for (int i = 0; i < 4; i++) {
printf("请输入第%d个数:\n", i + 1);
// 两种等价的写法
scanf("%d", &array[i]);
// scanf("%d", array + i); // 注:这行代码会导致输入冲突,应只使用一种方式
}
for (int i = 0; i < 4; i++) {
// 两种等价的写法
printf("数组第%d个数:%d\n", i, array[i]);
printf("数组第%d个数:%d\n", i, *(array + i));
}
指针类型变量的大小
打印不同类型的指针变量的大小。
// 指针类型变量在 64 位 CPU 的系统下的大小为 8 个字节
// 指针类型变量在 32 位 CPU 的系统下的大小为 4 个字节
// 在 64 位 Windows 10 系统下指针的大小
char *p1;
short *p2;
int *p3;
long *p4;
float *p5;
double *p6;
printf("char 类型指针%p的大小为:%d\n", (void *)p1, (int)sizeof(p1));
printf("short 类型指针%p的大小为:%d\n", (void *)p2, (int)sizeof(p2));
printf("int 类型指针%p的大小为:%d\n", (void *)p3, (int)sizeof(p3));
printf("long 类型指针%p的大小为:%d\n", (void *)p4, (int)sizeof(p4));
printf("float 类型指针%p的大小为:%d\n", (void *)p5, (int)sizeof(p5));
printf("double 类型指针%p的大小为:%d\n", (void *)p6, (int)sizeof(p6));
完整实例代码
#include <stdio.h>
int main() {
int array[4];
// 数组变量指向存储空间的首地址
printf("数组的地址:%p\n", (void *)&array);
printf("数组指针指向的地址:%p\n", (void *)array);
printf("数组第一个元素的地址:%p\n", (void *)&array[0]);
// 对指针进行加减操作,使指针指向上一个或下一个存储单元,存储单元的大小由数据类型决定,例如 char 是 1 byte, int 是 4 byte
for (int i = 0; i < 4; i++) {
printf("请输入第%d个数:\n", i + 1);
scanf("%d", &array[i]);
}
for (int i = 0; i < 4; i++) {
// 两种等价的写法
printf("数组第%d个数:%d\n", i, array[i]);
printf("数组第%d个数:%d\n", i, *(array + i));
}
// 指针类型变量在 64 位 CPU 的系统下的大小为 8 个字节
// 指针类型变量在 32 位 CPU 的系统下的大小为 4 个字节
// 在 64 位 Windows 10 系统下指针的大小
char *p1;
short *p2;
int *p3;
long *p4;
float *p5;
double *p6;
printf("char 类型指针%p的大小为:%d\n", (void *)p1, (int)sizeof(p1));
printf("short 类型指针%p的大小为:%d\n", (void *)p2, (int)sizeof(p2));
printf("int 类型指针%p的大小为:%d\n", (void *)p3, (int)sizeof(p3));
printf("long 类型指针%p的大小为:%d\n", (void *)p4, (int)sizeof(p4));
printf("float 类型指针%p的大小为:%d\n", (void *)p5, (int)sizeof(p5));
printf("double 类型指针%p的大小为:%d\n", (void *)p6, (int)sizeof(p6));
return 0;
}
注意事项
- 在
printf
中打印指针时,应将指针强制转换为(void *)
类型,以确保跨平台兼容性。 - 在
scanf
中,应只使用一种方式读取输入,避免输入冲突。 - 指针的大小在 64 位系统中通常是 8 字节,在 32 位系统中通常是 4 字节。