26、指针和数组分析(上)

1、数组的本质

  • 数组是一段连续的内存空间
  • 数组空间大小为sizeof(a)
  • 数组名可以看做指向数组第一个元素的指针常量

提出问题:
— 假设a是一个数组,a+1 = ?
— 假设a是一个指针,a+1 = ?
— 指针运算的意义是什么?结果又是什么?
指针+N 的本质就是指针所指向的地址+指向数据的类型占的内存大小 * N

#include <stdio.h>
int main()
{
	int a[5] = { 0 };
	int* p = NULL;

	printf("a = 0x%X\n", (unsigned int)(a));
	printf("a+1 = 0x%X\n", (unsigned int)(a+1));		//数组名+1等同于指针+1
	printf("p = 0x%X\n", (unsigned int)(p));
	printf("p+1 = 0x%X\n", (unsigned int)(p+1));
	
	return 0;
}

在这里插入图片描述
2、指针的运算

  • 指针是一种特殊的变量,与整数的运算规则为
    p+n = (unsigned int)p + n*sizeof(*p);

  • 结论:
    当指针p指向一个同类型的数组的元素时:p+1将指向当前元素的下一个元素;p-1将指向当前元素的上一个元素

  • 指针之间只支持减法运算

  • 参与减法运算的指针类型必须相同

p1 - p2  = ( (unsigned int)p1 - (unsigned int)p2 )/sizoeof(type)

注意:
— 只有当两个指针指向同一个数组的元素时,指针相减才有意义,其意义为指针所指元素的下标差
— 当两个指针指向的元素不在同一个数组中时,结果未定义

3、指针的比较

  • 指针也可以进行关系运算(<,<=,>,>=)
  • 指针关系运算的前提是同时指向同一个数组中的元素
  • 任意两个指针之间的比较运算(==,!=)无限制
  • 参与比较运算的指针类型必须相同
#include <stdio.h>
int main()
{
	char s1[] = { 'H','e', 'l', 'l', 'o' };
	int i = 0;
	char s2[] = { 'W','o', 'r', 'l', 'd' };

	char* p0 = s1;
	char* p1 = &s1[3];
	char* p2 = s2;
	int* p = &i;
	
	printf("%d\n", p0 - p1);		//-3
	//printf("%d\n", p0 + p1);		//error
	printf("%d\n", p0 - p2);		//error
	//printf("%d\n", p0 - p);		//error
	//printf("%d\n", p0 * p2);		//error
	//printf("%d\n", p0 / p2);		//error
	return 0;
}

在这里插入图片描述

#include <stdio.h>
#define DIM(a) (sizeof(a)/sizeof(*a))

int main()
{
	char s[] = { 'H','e', 'l', 'l', 'o' };
	char *pBegin = s;
	char *pEnd = s+ DIM(s);
	char* p = NULL;

	printf("pBegin = %p\n", pBegin);
	printf("pEnd = %p\n", pEnd);

	printf("size:%d\n", pEnd - pBegin);

	for (p = pBegin; p < pEnd; p++)
	{
		printf("%c\n", *p);
	}
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值