C语言面试题(四)--------------------网上题目
1、局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。要用全局變量,需要使用"::" ;局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。
注:此題我在Xcode上用了來,的確,如果是兩個循環的話,都可以用同名的變量,這在objective-c中是可以的,但我不記得在Java和C中是否可以了
?
2、如何引用一個已經定義過的全局變量?
答:extern
可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個編寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。
?
3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么?
答:可以,在不同的C文件中以static形式來聲明同名全局變量。
可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯.
?
4、static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
答: 1) 全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別在于非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
2) 從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。?????????????????? 3) static函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
綜上所述:
static全局變量與普通的全局變量有什么區別:
static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區別:
static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什么區別:
static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
?
5、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態區 )中,動態申請數據存在于( 堆)中。
6.求結果 int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); } typedef int(*FUNC1)(int); typedef int(*FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) { FUNC1 p = &inc; /* p是函數指針變量,它等于指向inc的指針,所以后面調用p就相當于調用inc */ int temp = p(arg1); fun(&temp,&arg1, arg2); printf("%d\n",*arg2); } main() { int a; show(multi,10,&a); return 0; } 結果 = 110 注:這道題主要是搞懂函數指針,比如那個func1 和 func2 就是函數指針,將main中的show直接帶入 void show(FUNC2 multi,10, &a) { FUNC1 p = &(++a); /* p是函數指針變量,它等于指向inc的指針,所以后面調用p就相當于調用inc */ int temp = p(arg1); //temp = 11 multi(&11,&10, &a); // a = 11 * 10 = 110 printf("%d\n",*arg2); }7、請找出下面代碼中的所有錯誤 (題目不錯,值得一看)
說明:以下代碼是把一個字符串倒序,如“abcd”倒序后變為“dcba”
#include"string.h"
main()
{
char*src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
return 0;
}
注:這道題主要考數組的越界,同時考申請內存和釋放內存的注意事項
<1>dest申請內存錯誤
char *dest = (char *)malloc[len+1]; ? ? //注意這里要包括結束符
<2>char *s = src[len-1] ?; ?? //如果下標是len的話,就越界了
<3>*d++ = *s--; ?? //單純的d++僅僅只是地址加一,并不是指針所指的值改變
<4>*d = 0; ? //字符串的末尾需要加結束符
<5>free(dest);??????? // 使用完,應當釋放空間,以免造成內存匯泄露
<6>dest = NULL; //防止產生野指針
以上就是這題的錯誤,如果要是先倒序輸出的話,還有另一個算法:
{
char str[ ] = "hello,world";
int len = strlen(str);
char t;
for (int i = 0; i < len/2; i++)
{
t = str[i];
str[i] = str[len-1- i]; ? //交換
str[len-1-i] = t;
}
?
}
?
8.對于一個頻繁使用的短小函數,在C語言中應用什么實現,在C++中應用什么實現?
c中用宏定義,c++用inline(就是我們常說的內聯函數)
?
9.博弈論的題,這道題也是公務員考試題
-1,2,7,28,,126請問28和126中間那個數是什么?為什么?
第一題的答案應該是4^3-1=63
規律是n^3-1(當n為偶數0,2,4)n^3+1(當n為奇數1,3,5)
答案:63
?
10.
轉載于:https://www.cnblogs.com/smartfish1989/archive/2012/02/29/2374780.html
總結
以上是生活随笔為你收集整理的C语言面试题(四)--------------------网上题目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 短信猫软件的实现
- 下一篇: [Win] 利用Memory DC抽取E