简单分析C++指针的操作和运算_C 语言

既然指针是一种数据类型,那么它也应该有对应的操作或运算,正如整数能做加减乘除一样。但是每一种操作或运算都应该对这种数据类型有意义。比如两个实数可以用关系运算得知哪个大哪个小,而两个虚数却不能使用关系运算,因为比较虚数的大小是没有意义的。

  对于指针类型来说,可以使用的运算有:和整数做加法运算、和整数做减法运算、两指针做关系运算。很显然,指针类型的乘除法是没有意义的,也是不允许的。

指针的加减运算

  指针的加减法和数的加减法是不同的。我们认为,指针只能够和整数做加减法运算(包括和整型常量、变量做加减法和自增自减)。其实这也不难理解,内存的存储空间是按“个”计算的,不会出现半个存储空间的情况。那么,指针的加减法是否在地址值上做加减呢?我们先写一段程序来验证一下指针加减法的运算结果:(程序8.3)

#include "iostream.h"
int main()
{
  int a[5]={1,2,3,4,5};
  int *aptr=&a[0];//把数组首元素的地址给指针
  int i=1;
  for (int j=0;j<5;j++)
  {
   cout <<'(' <<aptr <<")=" <<*aptr <<endl;//输出指针内存储的地址和该地址的数据
   aptr=aptr+i;//指针和整型变量做加法
  }
  return 0;
}

运行结果:

(0x0012FF6C)=1
(0x0012FF70)=2
(0x0012FF74)=3
(0x0012FF78)=4
(0x0012FF7C)=5

  我们发现,每次做了加法以后,地址值并不是相差1,而是相差了4。所以指针和整数做加法并不是简单地将地址值和整数相加。我们又发现,每次做了加法以后,能够输出原先指针所指的下一个元素。根据数组在内存中的存储情况我们不难得出这样一个结论:指针和整数C的加减法是指针向前或向后移动C个对应类型的存储区域,即可以得到以下公式:
    新地址=旧地址±C*每个对应数据类型的变量在内存中所占字节数

  因为每个int变量在内存中所占字节数为4,所以在程序8.3.1中每做完一次加法,新地址=旧地址+1*4=旧地址+4。如右上图8.3所示。

指针的关系运算

  我们知道关系运算有等于、大于、小于、大于等于、小于等于和不等于六种。对于指针来说,等于和不等于就是判断两个指针的值是否相同或不同,即两个指针是否指向了相同或不同的地方。而大于和小于是判断指针的值哪个大哪个小。值较小的在存储器中的位置比较靠前,值较大的在存储器中的位置比较靠后。

以上所述就是本文的全部内容了,希望大家能够喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索C++指针操作
C++指针运算
c语言指针运算、c语言指针运算符、c语言简单四则运算、易语言 指针操作、c语言 指针操作,以便于您获取更多的相关知识。

时间: 2024-11-01 22:07:04

简单分析C++指针的操作和运算_C 语言的相关文章

深入解析C语言中函数指针的定义与使用_C 语言

1.函数指针的定义    函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量. 因而"函数指针"本身首先应该是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整形变量.字符型.数组一样,这里是指向函数.C在编译时,

函数指针与指针函数的学习总结_C 语言

函数指针是指向函数的指针,指针函数是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑.各位能否讲的详细点呢? (1) float(**def)[10]   def是什么?(2) double*(*gh)[10]   gh是什么?(3) double(*f[10])()   f是什么?(4) int*((*b)[10])    b是什么?这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? ======================解答:   (1) def是一个指针, 指向的对象

讲解C语言编程中指针赋值的入门实例_C 语言

从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它处重新变赋值的.如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值.之后我的程序在其它任何处都不会再去重新对它赋值.那我又应该怎么办呢?用const . /* . . . */ const int ic =20; /* . . . */ ic = 40; /*这样是不可以的,编译时是无

c++将引用或者是指针作为函数参数实现实参的运算_C 语言

C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观.将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的性能.所以我们应该尽可能地使用引用,而非指针,但是应该要注意,因为局部变量具有自己短暂的生命周期,因此不能够返回对一个局部变量的引用. 引用通常是在被定义的时候被初始化,但是当它作为参数的时候,则是在被调用的时候被初始化.这时候对引用所做的改变就是对被引用的变量所做的改变. 引用对变量的访问是

C 语言简单加减乘除运算_C 语言

C语言也可以进行加减乘除运算,但是运算符号与数学中的略有不同,见下表. 加法 减法 乘法 除法 求余数 数学 + - × ÷ 无 C语言 + - * / %  加号.减号与数学中的一样,乘号.除号不同,另外C语言还多了一个求余数的运算符. 我们先来看一段代码: #include <stdio.h> #include <stdlib.h> int main() { int a=12; int b=100; float c=8.5; int m=a+b; float n=b*c; do

C++中队列的建立与操作详细解析_C 语言

什么是队列结构 队列结构是从数据运算来分类的,也就是说队列结构具有特殊的运算规则.而从数据的逻辑结构来看,队列结构其实就是一种线性结构.如果从数据的存储结构来进一步划分,队列结构可以分成两类. 顺序队列结构:即使用一组地址连续的内存单元依次保存队列中的数据.在程序中,可以定义一个指定大小的结构数组来作为队列. 链式队列结构:即使用链表形式保存队列中各元素的值. 在队列结构中允许对两端进行操作,但是两端的操作不同.在表的一端只能进行删除操作,称为队头:在表的另一端只能进行插入操作,称为队尾.如果队

C++中字符串以及数组和指针的互相使用讲解_C 语言

C++字符串与指针 在C++中可以用3种方法访问一个字符串(在第5章介绍了前两种方法). 用字符数组存放一个字符串 [例]定义一个字符数组并初始化,然后输出其中的字符串. #include <iostream> using namespace std; int main( ) { char str[]="I love CHINA!"; cout<<str<<endl; return 0; } 运行时输出: I love CHINA! 用字符串变量存放

c++中引用和指针的区别和联系_C 语言

C++中的引用和指针 ★ 相同点: 1. 都是地址的概念:指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名(java中的引用其实也是别名的意思). ★ 区别: 1. 指针是一个实体,而引用仅是个别名:2. 引用使用时无需解引用(*),指针需要解引用:3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" 4. 引用没有 const,指针有 const,const 的指针不可变:5. 引用不能为空,指针可以为空:6. "sizeof 引用&

图文详解c/c++中的多级指针与多维数组_C 语言

前言 首先先声明一些常识,如果你对这些常识还不理解,请先去弥补一下基础知识:      1.实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的.      2.数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址.      3.数组与指针的关系是因为数组下标操作符[],比如,int a[3][2]相当于*(*(a+3)+2) .      4.指针是一种变量,也具有类型,其占用内存空间大小和系统有关,一般32位系统下,sizeof(指针变量)=4.