简单解读指针变量的运算

    作者:课课家教育更新于: 2016-11-30 18:46:52

    大神带你学编程,欢迎选课

      在之前的C语言学习中课课家笔者给大家讲解了如何在C语言中进行加减乘除的运算,而在我们实际的编程中我们还会通过运用指针变量来进行加减乘除的运算,那么究竟具体的运算编写方法是怎么样的呢?下面笔者就给大家讲解C语言中指针变量的加减乘除具体的运算方法和编写方式。

      通常指针变量保存的是地址,在本质上说是一个整数,可以进行部分运算,比如加法、减法、比较等,具体大家可以观察下面的代码例子:

      #include

      intmain(){

      inta=10,*pa=&a,*paa=&a;

      doubleb=99.9,*pb=&b;

      charc='@',*pc=&c;

      //最初的值

      printf("&a=%#X,&b=%#X,&c=%#X\\n",&a,&b,&c);

      printf("pa=%#X,pb=%#X,pc=%#X\\n",pa,pb,pc);

      //加法运算

      pa++;pb++;pC++;

      printf("pa=%#X,pb=%#X,pc=%#X\\n",pa,pb,pc);

      //减法运算

      pa-=2;pb-=2;pc-=2;

      printf("pa=%#X,pb=%#X,pc=%#X\\n",pa,pb,pc);

      //比较运算

      if(pa==paa){

      printf("%d\\n",*paa);

      }else{

      printf("%d\\n",*pa);

      }

      return0;

      }

      输出结果:

      &a=0X28FF44,&b=0X28FF30,&c=0X28FF2B

      pa=0X28FF44,pb=0X28FF30,pc=0X28FF2B

      pa=0X28FF48,pb=0X28FF38,pc=0X28FF2C

      pa=0X28FF40,pb=0X28FF28,pc=0X28FF2A

      2686784

      从输出结果可以看出:pa、pb、pc每次加1,它们的地址分别增加4、8、1,正好是int、double、char类型的长度;减2时,地址分别减少8、16、2,正好是int、double、char类型长度的2倍。到这里估计很多初学者会提出“为什么指针变量加减运算的结果跟数据类型的长度有关,而不是简单地加1或减1?”这样的疑问。不用担心,下面笔者就为大家详细解答。以a和pa为例,a的类型为int,占用4个字节,pa是指向a的指针,具体如图1所示:

    简单解读指针变量的运算_编程语言_C语言_指针变量运算_课课家教育

    图1

      刚开始的时候,pa指向a的开头,通过*pa读取数据时,从pa指向的位置向后移动4个字节,把这4个字节的内容作为要获取的数据,这4个字节也正好是变量a占用的内存。若是pa++;使得地址加1的话,就会变成如图2所示的指向关系:

    指向关系

    图2

      这个时候pa指向整数a的中间,*pa使用的是红色虚线画出的4个字节,其中前3个是变量a的,后面1个是其它数据的,把它们“搅和”在一起显然没有实际的意义,取得的数据也会让人觉得非常奇怪。若是pa++;使得地址加4的话,正好能够完全跳过整数a,指向它后面的内存,具体如图3所示:

    内存

    图3

      我们知道,数组中的所有元素在内存中是连续排列的,若是一个指针指向了数组中的某个元素,那么加1就表示指向下一个元素,减1就表示指向上一个元素,这样指针的加减运算就具有了现实的意义。不过C语言并没有规定变量的存储方式,若是连续定义多个变量,它们有可能是挨着的,也有可能是分散的,这主要取决于变量的类型、编译器的实现以及具体的编译模式,所以对于指向普通变量的指针,我们往往不进行加减运算,虽然编译器并不会报错,但这样做没有意义,因为不知道它后面指向的是什么数据。下面给大家举一个反面代码例子,希望大家不要尝试通过指针获取下一个变量的地址:

      #include

      intmain(){

      inta=1,b=2,c=3;

      int*p=&c;

      inti;

      for(i=0;i<8;i++){

      printf("%d,",*(p+i));

      }

      return0;

      }

      在VS2010debug模式下的运行结果为:

      3,-858993460,-858993460,2,-858993460,-858993460,1,-858993460,

      从上面的代码例子和输出结果中我们可以发现,变量a、b、c并不挨着,它们中间还参杂了别的辅助数据。指针变量除了可以参与加减运算,还可以参与比较运算。当对指针变量进行比较运算时,比较的是指针变量本身的值,也就是数据的地址。若是地址相等,那么两个指针就指向同一份数据,否则就指向不同的数据。上面的代码(第一个例子)在比较pa和paa的值时,pa已经指向了a的上一份数据,所以它们不相等。而a的上一份数据又不知道是什么,所以会导致printf()输出一个没有意义的数,这正好印证了上面的观点,不要对指向普通变量的指针进行加减运算。另外需要说明的是,我们不能对指针变量进行乘法、除法、取余等其他运算,除了会发生语法错误,也没有实际的含义。

      本次简单解读指针变量的运算的讲解到此暂告一段落,若是以后有什么内容补充或者修改的话笔者会继续在此补充或者修改,同时也欢迎大家对本次讲解提出建议和补充。最后希望本次的讲解能对大家学习C语言起到一个帮助的作用!

C语言 更多推荐

课课家教育

未登录

1