二级指针与指针的运算

上回说到,指针,是变量的内存地址

其实二级指针,就是一级指针的内存地址

void main(){

   int i = 90;

   int *p = &i;

   int **p2 = &p;

   printf("%d",**p2);

   system("pause");

}

上面描述中,定义了一级指针p,二级指针p2

可以明显看出,*p2,就是一级指针p的地址,**p2,就是90! 就是最终的值!很通顺啊--

现在说说指针的运算

void main(){

      int num[] = {11,12,13,14,15};

      int *p = num;

      p++;

      printf("%d",*p);

      system("pause");

}

可以看出,num直接就是内存地址了,而不用写&num,实际上,写&num还会报错,过不了编译。这点跟JAVA是一样的,对于数组为讲,直接num,就是指的是内存地址!而且!是数组中的第一个元素的内存地址!!

固p++就好理解了,就是下一个元素的内存地址嘛,所以这里输出的是,是12

对应的,也有p--,指上一个元素的内存地址

这个机制背后的原因,就是数组的内存地址,其实是线性增加的!p++,就是将内存地址的值,向右移了sizeof(int)个单位! 在这里就是向右偏移了4个字节。

因此可以看出,指针的加减,其实只有在数组里有意义,更确切的实际使用地点,是在数组遍历的时候。

来个例子,这个例子是很原始,很低级语言的一种写法

void main(){

   int num[5];

   int *p = num;

   int i = 0;

   for (; p < num + 5;p++){

         *p = i;

          i++;

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

}

   system("pause");

}

在for中,p是指针!num是数组第一个元素的内存地址,num+5,就是最后一个数组中最后一个元素的内存地址。 可能会有疑问,int不是应该有4个字节吗,这里怎么看出来,只+1就行了。 注意,这里是指针,+1,就表示向右移了4个字节!!! 固这里的输出就是,0,1,2,3,4。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容