user-0 提问: 指向数组元素的指针为什么可以+1以后便能指向下一个元素？

回复:
user: user-1
content: 原因很简单：C语言规定的。 为什么这样规定：为了专业程序员用起来方便。

user: user-2
content: T* 类型的指针 + 1 移动的是 sizeof(T) 的距离

user: user-3
content: 引用 12 楼 dragonzxb 的回复:a[]  其实a可以理解为一个指针，是指向int型数据数组首地址的指针。 因此拓展开来,a[0]代表指向第一个数组元素，a[1]代表指向第二个数组元素。 而int型数据类型的占用内存位数是4。 因此按照C或者C++的规定（别问为什么这么规定），a+1必然代表着与a的址值差为4。 纠正一下，严格来说int型数据类型的占用内存位数是4个字节。

user: user-3
content: a[]  其实a可以理解为一个指针，是指向int型数据数组首地址的指针。 因此拓展开来,a[0]代表指向第一个数组元素，a[1]代表指向第二个数组元素。 而int型数据类型的占用内存位数是4。 因此按照C或者C++的规定（别问为什么这么规定），a+1必然代表着与a的址值差为4。

user: user-4
content: 指针加一并不是单纯的地址加一，而是指向下一个元素的地址，在int 型指针里相邻的元素地址相差为四 ，所以p+1实际上地址是加了4的

user: user-5
content: 引用 7 楼 aizhaoyu 的回复:楼主问了一个非常好的问题，一个指针+1，在内存中到底是移动了多少？ 下面是我根据楼主的程序做的扩展。  #include <stdio.h>  void func1() {     int *p,a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; } void func2() {     char *p,a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; } void func3() {     int *p;     char a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; } void func4() {     char *p;     int a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; }   int main() {     func1();     func2();     func3();     func4(); }  运行结果为： 1,      1b167ed0 2,      1b167ed4 3,      1b167ed8 4,      1b167edc 5,      1b167ee0 6,      1b167ee4 7,      1b167ee8 8,      1b167eec 9,      1b167ef0 10,     1b167ef4 x:1b167ef8, y:1b167efc, z:1b167efc 1,      1b167ef0 2,      1b167ef1 3,      1b167ef2 4,      1b167ef3 5,      1b167ef4 6,      1b167ef5 7,      1b167ef6 8,      1b167ef7 9,      1b167ef8 10,     1b167ef9 x:1b167efa, y:1b167efb, z:1b167efb 67305985,       1b167ef0 134678021,      1b167ef4 4196873,        1b167ef8 x:1b167efc, y:1b167f00, z:1b167f00 1,      1b167ed0 0,      1b167ed1 0,      1b167ed2 0,      1b167ed3 2,      1b167ed4 0,      1b167ed5 0,      1b167ed6 0,      1b167ed7 3,      1b167ed8 0,      1b167ed9 0,      1b167eda 0,      1b167edb 4,      1b167edc 0,      1b167edd 0,      1b167ede 0,      1b167edf 5,      1b167ee0 0,      1b167ee1 0,      1b167ee2 0,      1b167ee3 6,      1b167ee4 0,      1b167ee5 0,      1b167ee6 0,      1b167ee7 7,      1b167ee8 0,      1b167ee9 0,      1b167eea 0,      1b167eeb 8,      1b167eec 0,      1b167eed 0,      1b167eee 0,      1b167eef 9,      1b167ef0 0,      1b167ef1 0,      1b167ef2 0,      1b167ef3 10,     1b167ef4 0,      1b167ef5 0,      1b167ef6 0,      1b167ef7 x:1b167ef8, y:1b167ef9, z:1b167ef9  现象分析： func1中指针和数组均是int类型，p+1后实际内存中是移动了4字节 func2中指针和数组均是char类型，p+1后实际内存中是移动了1字节 func3中指针是int类型，数组是char类型，p+1后实际内存中是移动了4字节 func4中指针是char类型，数组是int类型，p+1后实际内存中是移动了1字节  结论： 指针+1，在内存中实际移动的大小和指针的类型是相关，而和所指向的内容类型是没有关系的。  不用这么一大串，我已经讲了

user: user-6
content: 楼主问了一个非常好的问题，一个指针+1，在内存中到底是移动了多少？ 下面是我根据楼主的程序做的扩展。  #include <stdio.h>  void func1() {     int *p,a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; } void func2() {     char *p,a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; } void func3() {     int *p;     char a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; } void func4() {     char *p;     int a[] = {1,2,3,4,5,6,7,8,9,10};     int *end = a+10;     for(p = a;p < end;p++){         printf("%i,\t%x\n",*p,p);      }      int x=p;     int y=p+1;     int z=++p;      printf("x:%x, y:%x, z:%x\n", x, y, z);     return; }   int main() {     func1();     func2();     func3();     func4(); }  运行结果为： 1,      1b167ed0 2,      1b167ed4 3,      1b167ed8 4,      1b167edc 5,      1b167ee0 6,      1b167ee4 7,      1b167ee8 8,      1b167eec 9,      1b167ef0 10,     1b167ef4 x:1b167ef8, y:1b167efc, z:1b167efc 1,      1b167ef0 2,      1b167ef1 3,      1b167ef2 4,      1b167ef3 5,      1b167ef4 6,      1b167ef5 7,      1b167ef6 8,      1b167ef7 9,      1b167ef8 10,     1b167ef9 x:1b167efa, y:1b167efb, z:1b167efb 67305985,       1b167ef0 134678021,      1b167ef4 4196873,        1b167ef8 x:1b167efc, y:1b167f00, z:1b167f00 1,      1b167ed0 0,      1b167ed1 0,      1b167ed2 0,      1b167ed3 2,      1b167ed4 0,      1b167ed5 0,      1b167ed6 0,      1b167ed7 3,      1b167ed8 0,      1b167ed9 0,      1b167eda 0,      1b167edb 4,      1b167edc 0,      1b167edd 0,      1b167ede 0,      1b167edf 5,      1b167ee0 0,      1b167ee1 0,      1b167ee2 0,      1b167ee3 6,      1b167ee4 0,      1b167ee5 0,      1b167ee6 0,      1b167ee7 7,      1b167ee8 0,      1b167ee9 0,      1b167eea 0,      1b167eeb 8,      1b167eec 0,      1b167eed 0,      1b167eee 0,      1b167eef 9,      1b167ef0 0,      1b167ef1 0,      1b167ef2 0,      1b167ef3 10,     1b167ef4 0,      1b167ef5 0,      1b167ef6 0,      1b167ef7 x:1b167ef8, y:1b167ef9, z:1b167ef9  现象分析： func1中指针和数组均是int类型，p+1后实际内存中是移动了4字节 func2中指针和数组均是char类型，p+1后实际内存中是移动了1字节 func3中指针是int类型，数组是char类型，p+1后实际内存中是移动了4字节 func4中指针是char类型，数组是int类型，p+1后实际内存中是移动了1字节  结论： 指针+1，在内存中实际移动的大小和指针的类型是相关，而和所指向的内容类型是没有关系的。

user: user-7
content: int在内存中占四个字节，你多了一个数，地址向后偏移四位

user: user-5
content: 首先楼主要明白，数组直接名字有2个含义，如果直接sizeof数组名的话，得到的是数组的完整大小，如果直接写数组的 话实际上又是首元素的地址   因为数组有n个地址单元，而这个地址单元又是已知的+1的含义其实是移动到下一地址单元而非值加一，比如  int a[10];  a+1实际上是a+sizeof(int)*1 如果  char a[10];  a+1实际上是a+sizeof(char)*1

user: user-8
content: 指针的类型是指针，不是 int .

user: user-0
content: 引用 2 楼 xiaoleecr 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 因为int类型是4个字节，int *p，p++就是偏移4个字节，不然它取不到下一个元素，所以，在内存指针地址相差是4 我就是没理解2263264,2263268这些应该都是int型，我刚刚输出了（p+1）-p的值，发现真是1，但这2263264,2263268两个数命名相差4啊[/quote]明明相差4       不好意思打错字了

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:因为int类型是4个字节，int *p，p++就是偏移4个字节，不然它取不到下一个元素，所以，在内存指针地址相差是4 我就是没理解2263264,2263268这些应该都是int型，我刚刚输出了（p+1）-p的值，发现真是1，但这2263264,2263268两个数命名相差4啊

user: user-9
content: 因为int类型是4个字节，int *p，p++就是偏移4个字节，不然它取不到下一个元素，所以，在内存指针地址相差是4