#include <stdio.h>
#include <stdint.h>
int main(void)
{
//指针的算术运算
int32_t numbers[] = {10, 20, 30, 40, 50, 60 ,70, 80, 90, 100};
int32_t* ptr = numbers; //无取地址符,也无数组下标,表示&numbers[0]
//数组在内存中是连续的
//0 -> 00000000090
//所以只需要一个首地址就可以找到整个数组在哪里。
//计算数组的大小
size_t size = sizeof(numbers) / sizeof(numbers[0]);
//size_t 用来定义 字节大小、下标INDEX 的整数类型(%zu),是32位
//sizeof(numbers) 用来计算整个数组所占用的字节大小;
//sizeof(numbers[0])用来计算第一个元素所占用字节的大小;
printf("number数组的大小size = %zu\n\n",size);
printf("数组原始数据\nnumbers[%zu] = {",size);
for(int32_t i = 0;i < size;++i){
if(i<size - 1){
printf("%d, ",numbers[i]);
}else{
printf("%d",numbers[i]);
}
}
printf("}\n\n");
//使用指针加法移动指针
puts("使用指针加法访问第五个元素: ");
ptr += 4; // ptr 储存的是numbers[0]的地址;*ptr 储存的是numbers[0]的值
printf("numbers[5] = %d\n\n",*ptr);
//使用指针减法回到第一个元素
puts("使用指针减法回到第一个元素: ");
ptr -= 4;
printf("numbers[0] = %d\n\n",*ptr);
//指针之间的减法计算距离
int32_t* start_ptr = &numbers[0];
int32_t* end_ptr = &numbers[size - 1];
//end_ptr - start_ptr 用ptrdiff_t(%td)类型表示
printf("数组首尾之间的距离是: %td\n\n",end_ptr - start_ptr);
//指针之间的比较
puts("比较两个指针指向的元素:");
if(start_ptr < end_ptr){
puts("start_ptr 指向的元素在 end_ptr 之前\n");
} //指针之间比较的是地址的先后,用*数组存储的大小无关
//使用指针遍历数组
printf("使用指针遍历数组:\n外部指针遍历*p = { ");
for(int* p = start_ptr;p < end_ptr;++p){
printf("%d ",*p);
}
printf("}\n\n");
//使用指针减法逐个访问数组中每个元素的反向顺序
puts("使用指针减法逐个访问数组中每个元素的反向顺序:");
printf("*p = { ");
for(int32_t* p = end_ptr;p >= start_ptr;--p){
if(p > start_ptr){
printf("%d, ",*p);
}else{
printf("%d",*p);
}
}
puts("}\n");
//指针加减整数访问特定元素
puts("指针加减整数访问特定元素:");
int32_t third = 3;
printf("第四个元素(使用加法),*(start_ptr+third) = %d\n\n",*(start_ptr+third));
//回退到第三个元素
puts("使用指针减法回退到第三个元素");
printf("第三个元素(使用减法),*(start_ptr+third-1) = %d\n\n",*(start_ptr+third-1));
//比较两个指针
int* middle_ptr = &numbers[size / 2];
puts("比较两个指针向量的位置:");
if(middle_ptr > start_ptr){
puts("start_ptr 指向的元素在middle_ptr 之前");
}
if(middle_ptr < end_ptr){
puts("end_ptr 指向的元素在middle_ptr 之后");
}
return 0;
}
**代码中详细罗列了指针在数组中可能的使用情况,并不完整,整理自Micro_Frank。**