指针加法

指针加法

  • 上图,列出了指针加1的三种可能;
  • 首先我们编译代码试运行测试第一种可能
  • #include<stdio.h>
    int main()
    {
    	int arr[10] = {1,2,3};
    	int *p = arr;
    	//p++;
    	p = (int *)((int)p+1);
    	*p = 10;
    	printf("%d,%d\n",arr[0],arr[1]);
    
    	return 0;
    }
    

    得出结果如下
    指针加法

  • 很明显这种是不对的,整型是4个字节,他移动一个字节的花会破坏数组中俩个元素的值,图上的篮筐显示a[0],绿框表示a[1],红筐表示按加一个字节算法移动后的a[1]。
  • 照上图所示,a[1]应该等于10。但是由于这是一个字节移动,改变了a[0]的3个字节和a[1]的一个字节,a[0] 就变成了0x010a0000。所以加一个字节这种算法不合适。
  • 第三种加一个数组明显不行
  • 那就是第二种,编辑代码运行
  • #include<stdio.h>
    int main()
    {
    	int arr[10] = {1,2,3};
    	int *p = arr;
    	//p++;
    	p = ((int*)p+1);
    	*p = 10;
    	printf("%d,%d\n",arr[0],arr[1]);
    
    	return 0;
    }
    
    

    结果如下
    指针加法

  • 我们看到结果是正确的,所以说指针加1应该是每次加一个单元格。
  • 这里我们用了 p = ((int*)p+1) (指针+-数字,地址值需要调整,调整的权重为sizeof(指针去掉一个*) 所以他是加了4个字节,也就是整型的一个单元格。