C语言中指针在数组的使用--摘自Micro_Frank

hongxun-blogs / 2024-10-13 / 原文

#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。**