C语言 指针的运算

目录

一、介绍

二、指针  +   整数  、指针  -  整数

二、指针  -  指针

四、指针的关系运算


一、介绍

在C语言中,指针的运算分为三类

  • 1、指针  +   整数  、指针  -  整数
  • 2、指针  -   指针
  • 3、指针的关系运算

二、指针  +   整数  、指针  -  整数

因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。

// 利用指针的整数运算,打印数组的每一个元素

int main()
{
  int arr[]={1,2,3,4,5,6,7,8,9,10};
  int * p =&arr[0];//将首地址交予了指针变量p
  int i =0;
  int sz = sizeof(arr)/sizeof(arr[0]);
  for(i = 0; i < sz; i++)
  {
      printf("%d",*(p+i));//*(p+i)相当于首地址跳过了i*4 个字节,并指向了p+i 地址的内容
  }
  return 0;
}

// 在数组中的首地址就是arr[0]的地址

// 当p存储的是首地址时

// *(p+i) 相当于 arr[0+i] 它们是表示内容

// 而 p+i  则相当于 &arr[0+i]  它们是表示地址 甚至可以写成 &arr[0]+i ---> &arr[i]

// 利用指针的整数运算,打印出字符串

int main()
{
  int arr = "abcdef";
  char * p = &arr[0];
  while(*p != '\0')
  //  abcdef 在数组中是 ['a','b','c','d','e','f','\0'] 二打印字符串并不需要\0
  {
     printf("%c",*p);
     p = p+1;//进行地址的修改 使得*p所指向的内容转移到下一个地址中的内容
  }
  return 0;
}

二、指针  -  指针

指针-指针本质是地址减去地址。

而指针-指针的前提是:指针-指针(地址-地址]的前提是两个指针指向同一块空间的。

且指针-指针(地址-地址)得到的值的绝对值是指针和指针之间元素的个数。

int main()
{
  int arr [10] = {0};
  int ret = &arr[9] - &arr[0];
  int ret1 = &arr[0] - &arr[9];
  
  printf("%d\n",ret);
  return 0;
 
}

// 得出的答案是 ret = 9  ret1 = -9

// 应用
// 利用指针 - 指针 求字符串的长度

 int my_strlen(char* str)//传数组名,数组名也就是首元素地址
{
	char* start = str;//将数组首地址交予一个新的指针变量

	while (*str != '\0')//打印字符串不打印\0
	{
		str++;//指针内存储的地址不断地往下移动
	}
	return str - start;//使用最后\0前的指针变量减去首元素的指针变量
}

int mian()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d",len);
	return 0;
}

四、指针的关系运算

指针的关系与运算,实质上就是指针比较大小,本质上是地址比较大小

// 应用
// 利用指针的大小关系,打印出数组中的所有元素


int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//arr表示的是首元素地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz)//指针的关系运用
	{
		printf("%d ",*p);
		p++;
	}
	return 0;
}


// p<arr+sz表示的是 p所存储的地址要小于 数组的边界范围的地址 
// 例如题中arr[10]是不存在的,而arr+sz相当于&arr[0] + 10 = &arr[10] 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值