C语言 - 指针算术

C语言 - 指针算术 首页 / C语言入门教程 / C语言 - 指针算术

我们可以对指针执行算术运算,例如加法,减法等。但是,由于我们知道指针包含地址,因此如果另一个操作数的类型为整数,对指针执行算术运算的结果也将是指针。在指针到指针的减法中,结果将是一个整数值。使用C语言的指针可以进行​​以下算术运算:

  • 增量
  • 递减
  • 加法
  • 减法
  • 比较

C增量指针

如果我们将指针增加1,则指针将开始指向紧邻的下一个位置。这与常规算法有些不同,因为指针的值将增加指针所指向的数据类型的大小。

我们可以通过对指针使用增量操作来遍历数组,该操作将不断指向数组的每个元素,对该数组执行一些操作,然后在循环中更新自身。

无涯教程网

下面给出增加指针的规则:

new_address= current_address + i * size_of(data type)

其中,i是指针增加的数字。

32位架构  -  对于32位int变量,它将增加2个字节。

64位架构  -  对于64位int变量,它将增加4个字节。

让我们看一下在64位架构上递增指针变量的示例。

#include<stdio.h>  
int main(){
  int number=50;      
  int *p;//指向 int 的指针  
  p=&number;//存储number变量的地址  
  printf("Address of p variable is %u \n",p);      
  p=p+1;      
  printf("After increment: Address of p variable is %u \n",p);//在我们的例子中,p 将增加 4 个字节。   
  return 0;
}  

输出

Address of p variable is 3214864300 
After increment: Address of p variable is 3214864304 

指针遍历数组

#include<stdio.h>
void main ()
{
	int arr[5] = {1, 2, 3, 4, 5};
	int *p = arr;
	int i;
	printf("printing array elements...\n");
	for(i = 0; i< 5; i++)
	{
		printf("%d  ",*(p+i));
	}
}

输出

printing array elements...
1  2  3  4  5

C递减指针

像递增一样,我们可以递减指针变量。如果我们递减指针,它将开始指向先前的位置。递减指针的公式如下:

new_address= current_address - i * size_of(data type)
32位架构   -  对于32位int变量,它将减少2个字节。
64位架构   -  对于64位int变量,它将减少4个字节。

让我们看一下在64位OS上递减指针变量的示例。

#include <stdio.h>            
void main(){            
  int number=50;        
  int *p;//指向 int 的指针     
  p=&number;//存储 number 变量的地址      
  printf("Address of p variable is %u \n",p);        
  p=p-1;       
  printf("After decrement: Address of p variable is %u \n",p); // P 现在将指向之前的直接位置。
}      

输出

Address of p variable is 3214864300 
After decrement: Address of p variable is 3214864296 

C指针加法

我们可以向指针变量添加一个值。给指针增加值的公式如下:

new_address= current_address + (number * size_of(data type))
32位架构   -  对于32位int变量,它将加上2 *数字。
64位架构   -  对于64位int变量,它将加上4 *数字。

让我们看一下在64位架构上为指针变量添加值的示例。

#include<stdio.h>  
int main(){
  int number=50;      
  int *p;//指向 int 的指针   
  p=&number;//存储 number 变量的地址      
  printf("Address of p variable is %u \n",p);      
  p=p+3;   //将 3 添加到指针变量 
  printf("After adding 3: Address of p variable is %u \n",p);     
  return 0;
}  

输出

Address of p variable is 3214864300 
After adding 3: Address of p variable is 3214864312

如您所见,p的地址为3214864300。但是在将3与p变量相加后,它的值为3214864312,即4 * 3 = 12的增量。由于我们使用64位架构,因此增加了12。但是如果我们使用32位架构,则仅增加了6,即2 * 3 = 6。由于整数值在32位OS中占用2字节内存。

C指针减法

像指针加法一样,我们可以从指针变量中减去一个值。从指针中减去任何数字将得到一个地址。从指针变量减去值的公式如下:

new_address= current_address - (number * size_of(data type))
32位架构   -  对于32位int变量,它将加上2 *数字。
64位架构   -  对于64位int变量,它将加上4 *数字。

让我们看一下在64位架构上从指针变量中减去值的示例。

#include<stdio.h>  
int main(){
  int number=50;      
  int *p;//指向 int 的指针
  p=&number;//存储 number 变量的地址     
  printf("Address of p variable is %u \n",p);      
  p=p-3; //从指针变量中减去 3
  printf("After subtracting 3: Address of p variable is %u \n",p);      
  return 0;
}  

输出

Address of p variable is 3214864300 
After subtracting 3: Address of p variable is 3214864288

您可以从指针变量中减去3后看到,它比先前的地址值小12(4 * 3)。

但是,除了减去数字以外,我们还可以从另一个地址(指针)中减去一个地址。这将产生一个数字。这不是一个简单的算术运算,但是它将遵循以下规则。

如果两个指针的类型相同,

Address2 - Address1 = (Subtraction of two addresses)/size of data type which pointer points

考虑以下示例,从另一个指针中减去一个指针。

#include<stdio.h>
void main ()
{
	int i = 100; 
	int *p = &i;
	int *temp;
	temp = p; 
	p = p + 3;
	printf("Pointer Subtraction: %d - %d = %d",p, temp, p-temp);
}

输出

Pointer Subtraction: 1030585080 - 1030585068 = 3

指针非法算术

无法对指针执行各种操作。由于指针存储地址,因此我们必须忽略可能导致非法地址的操作,例如加法和乘法。下面列出了此类操作。

  • Address + Address = illegal
  • Address * Address  = illegal
  • Address % Address = illegal
  • Address/Address     = illegal
  • Address & Address  = illegal
  • Address ^ Address   = illegal
  • Address | Address    = illegal
  • ~Address                   = illegal

正如我们在上一章中讨论的那样,指针可以指向C中的函数。但是,指针变量的声明必须与该函数相同。考虑以下示例,以使指针指向该函数。

#include<stdio.h>
int addition ();
int main ()
{
	int result; 
	int (*ptr)();
	ptr = &addition;
	result = (*ptr)();
	printf("The sum is %d",result);
}
int addition()
{
	int a, b; 
	printf("Enter two numbers?");
	scanf("%d %d",&a,&b);
	return a+b;
}

输出

Enter two numbers?10 15 
The sum is 25  

C数组指针

要了解函数数组的概念,我们必须了解函数数组。基本上,函数数组是一个包含函数地址的数组。换句话说,指向函数数组的指针是指向包含函数指针的数组的指针。考虑以下示例。

#include<stdio.h>
int show();
int showadd(int);
int (*arr[3])();
int (*(*ptr)[3])();

int main ()
{
    int result1;
	arr[0] = show;
	arr[1] = showadd;
	ptr = &arr;
	result1 = (**ptr)();
	printf("printing the value returned by show : %d",result1);
	(*(*ptr+1))(result1);
}
int show()
{
	int a = 65;
	return a++;
}
int showadd(int b)
{
    printf("\nAdding 90 to the value returned by show: %d",b+90);
}

输出

printing the value returned by show : 65 
Adding 90 to the value returned by show: 155

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

分布式技术原理与算法解析 -〔聂鹏程〕

Netty源码剖析与实战 -〔傅健〕

NLP实战高手课 -〔王然〕

重学线性代数 -〔朱维刚〕

Linux内核技术实战课 -〔邵亚方〕

手机摄影 -〔@随你们去〕

去无方向的信 -〔小麥〕

网络排查案例课 -〔杨胜辉〕

结构学习力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)