编程初步入门10个问题
数组参数的地址和数组参数的第一个元素的地址一样吗?为什么?
假设有一维数组a[10],指针变量p要指向这个数组的首地址,即a[0]的地址,那么p=a,似乎是固定的语法,这个数组的首地址就为数组名a,其实应该是a+0;因为零不算,就直接表示成a了。那么a[0]到a[9]的每个元素的地址,都可以用a+i来表示,i为元素的个数,即a[1]的地址为a+1,以此类推。故 数组名是没有地址的,只有数组中的每个元素有地址而数组元素的地址,用“数组名+i”的形式来表示而已。
数组作为参数传递给函数时,可以通过sizeof得到数组的大小吗?
不可以。当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种机制告诉函数数组参数的大小。
可以把另一个地址赋给一个数组名吗?
不可以,尽管在一个很常见的特例中好象可以这样做。数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。如果一个数组是用extern或static说明,则它的数组名是在连接时可知的一个常量,不能修改这样一个数组名的值。给数组名赋值是毫无根据的。因此,需要使用指针,就应该使用指针。
字符串和数组有什么不同?
字符串有结束符,字符数组没有结束符(自己可以加上,如果是用系统函数输入的,系统会自动加)。总的来说是没有区别的,字符串就是以字符数组形式存储的。你可以把一个字符串看成是一个字符数组,可以按数组那样操作。两者没有本质的区别,只是在不同的情况下有不同的叫法。
什么是回调函数?
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
什么是变参函数?
在C中,对函数参数的扫描是从后向前的。C的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。printf的第一个被找到的参数就是那个字符指针,就是被双引号括起来的那一部分,函数通过判断字符串里控制参数的个数来判断参数个数及数据类型,通过这些就可算出数据需要的堆栈指针的偏移量。
Return、break、continue的区别?
break:.结束当前整个循环,执行当前循环下边的语句。忽略循环体中任何其它语句和循环条件测试。(2).只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出。[逐层判断,逐步跳出](3).当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体。
总的来说:就近原则,结束当前的整个循环。
return:(1).return从当前的方法中退出,返回到该调用的方法的语句处,继续执行。(2).return返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致。(3).return后面也可以不带参数,不带参数就是返回空,其实主要目的就是用于想中断函数执行,返回调用函数处。
continue:(1).终止本次循环的执行,即跳过当前这次循环中continue语句后尚未执行的语句,接着进行下一次循环条件的判断。(2).结束当前循环,进行下一次的循环判断。(3).终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行.
如何编写有多个返回值的C语言函数?
1、全局变量是在函数外部定义的全局变量,它不属于任何一个函数,其作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。当我们需要函数返回多个值时,除了函数体中的return语句返回其中一个之外,其它的返回值我们可以通过定义全局变量来处理。
2、以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。
3、编写返回多个值的C语言函数可以考虑采用结构体的方式去实现。如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值。