本文从指针步长设置的意义出发帮助大家理解步长的转换。
指针+-运算的本质:我认为指针的加减运算就是同级别的步长问题,对一个地址进行加减运算,根据这个地址所占的字节长度来把+-的数字乘以该长度得到的字节单位就是对应的步长,这么说可能有点难理解,举个例子一下就懂。
int a = 1;int * p = &a;p+1,这里步长是四个字节,因为p代表的就是一个整形变量的地址,而&a 又赋值给int *类型的p,这里int *类型才真正决定了步长。
比较
int a = 1;
int b[10] = {0};
int c[5][4] = {0};
&a+1:因为&a就是a的地址,意义为四个字节的一个整数的地址,所以步长根据a的类型来决定,最终步长为4.
b+1:b的意义是第一个元素的地址,而这第一个元素是四个字节大小的整形,所以步长为4
&b + 1:&b的意义是整个数组,代表了全部10个元素一共40个字节,所以这时候步长变成了40
c+1:c的意义是某一行的地址,这里一行是四个元素,每个元素大小是4,c指向了一共16个字节大小的元素的地址(尽管按%p输出c只会显示起始端),这时候步长是16
c[0] + 1或者c[2]+1:c[0]的意义是第一行的第一个元素,c[2]的意义是第三行的第一个元素,都指向4个字节的一个元素,所以对应步长4
&c + 1:&c的意义是指向整个二维数组4*5 ==20个元素一共80个字节,对应步长为80
对比完这些可以知道判断步长大小的关键在于指针的意义,指向x元素,步长等于指针类型大小 * x,如果没有指定指针类型直接取地址(&)或者用表示地址的东西,那么指针大小类型随计算机决定(32位默认4个字节,64位默认8个字节)
为什么是这样,是因为c语言的创始人想要通过这样设置步长来使自己的操作更方便,不然步长都统一或者是乱的那么指针就很难应用,通过根据具体的意义来设置步长既有利于自己的操作也让别人接触学习更加方便。