在创建变量时,例如int a
我们在执行代码
int a;
&a+1;
当进行这样的操作时,a的地址会自动加4,代码执行时,会自动识别a为int类型,在转换成汇编的时候,就有类似jump四个字节的操作。
当遇到代码:
int test[int arr[]];
就想到为什么传参还要强调类型呢?
参数的类型是为了进行一位操作时要跳跃的地址
例如
int test[int arr[]]
{
arr + 1;
}
传入的是arr的首地址,加一操作,就会跳跃四个字节。
如果把代码换成
int test[char arr[]]
{
arr + 1;
}
加一操作,就会跳跃一个字节。
所以不论arr数组元素本身是int还是char都无所谓,进行加一操作都是取决于形参本身。
回到原来的问题:为什么传参还要强调类型呢?
为了知道进行一位操作要跳几个字节吗?
那么为什么不定义一个通用的类型呢,当我们想对数组本身进行操作时,例如int型数组,我们就要跳四个字节操作,就由编译器转汇编的时候自己识别是int型,因为在定义一个整形的时候就能自己识别要跳一个整形的大小,想进行其他类型操作时,例如char型数组,我们想进行跳四个字节操作就进行强转。这样设计就会把规则设计的更加通用,更加方便。
当然有(void*)型,但是这个无法自己识别,每次都要强转。在思考这个问题的时候就在想为什么没有把(void*)设计成上面所说的那种操作。
后来经过和学长的讨论得到一些自己感觉解释的通的结论:
1.如果那样设计的话,在每次执行自己定义的时候,底层或者汇编上面都会有一个识别的过程,会降低代码执行的速度,而且当函数不仅仅是那些简单的指针,例如出现结构体或着一些更复杂的,汇编上可以只有几句话,但是编译器要进行很大的修改。
2.C语言,毕竟C生万物,C语言更讲求速度,目前的设计,代码执行更快,让程序员自己写要怎么操作,让编译器省去判断的步骤,代码执行更快,虽然程序员要自己多写几句。但C语言更讲求代码效率。听说python就是自己识别,但是执行速度不够快。但目前还没有学习python。
3.C语言目前的规则就是这样,传参只是传一个地址,并没有传地址所存变量的类型,对地址如何操作由程序员决定。感觉这样解释确实可以,这样就不需要代码执行的时候加判断步骤了,我们要怎么操作就自己写,无非就是多了程序员多了一步,而且不必拘泥于传参的原来的类型,权限更高,代码执行更简单。
这些都是目前的猜测,可能随着学习的深入,会改变目前的理解。如果有大佬看见,希望可以指点一二。