1、局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對於有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。
2、如何引用一個其它文件已經定義過的全局變量?
答:可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個編寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯。
3、用變量a給出下面的定義
a) 一個整型數
b)一個指向整型數的指針
c)一個指向指針的的指針,它指向的指針是指向一個整型數
d)一個有10個整型數的數組
e) 一個有10個指針的數組,該指針是指向一個整型數的
f) 一個指向有10個整型數數組的指針
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數
3、用變量a給出下面的定義_續
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
指針的數據類型
定義含義
int i; 定義整形變量i
int *p; p爲指向整形數據的指針變量
int a[n]; 定義整形數組a, 它有n個元素
int *p[n]; 定義指針數組p, 它由n個指向整形數據的指針元素組成
int (*p)[n]; p爲指向含n個元素的一維數組的指針變量
int f(); f爲帶回整形函數值的函數
int *p(); p爲帶回一個指針的函數,該指針指向整形數據
int (*p)(); p爲指向函數的指針,該函數返回一個整形值
int **p; p是一個指針變量,它指向一個指向 整形數據的指針變量
4、關鍵字static的作用是什麼?
1)在函數體,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變。
2) 在模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
3) 在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。
5、關鍵字const有什麼含意?
const意味着“只讀”。另外,const可以使編譯器很自然地保護那些不希望被改變的變量或參數(用const修飾),防止其被無意的代碼修改。
下面的聲明都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
6、關鍵字volatile有什麼含意?
一個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裏的備份。
1) 並行設備的硬件寄存器(如:狀態寄存器);
2) 一箇中斷服務子程序中會訪問到的非自動變量(Non- automatic variables);
3) 多線程應用中被幾個任務共享的變量。
7、全局變量可不可以定義在可被多個.C文件包含的頭文件中?爲什麼?
可以,在不同的C文件中以static形式來聲明同名全局變量。在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯。
8、設有以下說明和定義:
typedef union{
long i;
int k[5];
char c;
} DATE;
struct data{
int cat;
DATE cow;
double dog;
} too;
DATE max;
則語句printf("%d",sizeof(struct data)+sizeof(max));的執行結果是:___
9、請找出下面代碼中的所有錯誤(說明:以下代碼是把一個字符串倒序,如“abcd”倒序後變爲“dcba”)
#include"string.h"
int main(){
char*src="hello,world";
char* dest=NULL;
intlen=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0){
*d=*s--;
d++;}
printf("%s",dest);
return 0;
}
10、隊列和棧有什麼區別?
11、對於一個頻繁使用的短小函數,在C語言中應用什麼實現,在C++中應用什麼實現?
12、軟件測試都有那些種類?
13、確定模塊的功能和模塊的接口是在軟件設計的哪個階段完成的?
14、計算表達式值?
unsigned char *p1;
unsigned int *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned int *)0x810000;
請問:
p1+5= ;
p2+5= ;
15、進程和線程的差別?
線程是指進程內的一個執行單元,也是進程內的可調度實體。線程與進程的區別:
(1)調度:線程作爲調度和分配的基本單位,進程作爲擁有資源的基本單位;
(2)併發性:不僅進程之間可以併發執行,同一個進程的多個線程之間也可併發執行;
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源;
(4)系統開銷:在創建或撤消進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。
16、Heap與stack的差別。
Heap是堆,stack是棧。
Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。
Stack空間有限,Heap是很大的自由存儲區
C中的malloc函數分配的內存空間即在堆上,C++中對應的是new操作符。
程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上進行。
17、解釋下列輸出結果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
18、以下代碼中的兩個sizeof用法有問題嗎?
void UpperCase( char str[] ) // 將小寫字母轉換成大寫字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str && str<='z' )
str -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符長度爲: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
18、以下代碼中的兩個sizeof用法有問題嗎?
函數內的sizeof有問題。根據語法,sizeof如用於數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小爲6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用於上只將其當指針看,一個指針爲4個字節,因此返回4。
注意:數組名作爲函數參數時,退化爲指針.
數組名作爲sizeof()參數時,數組名不退化,因爲sizeof不是函數.
19、指出下面代碼的輸出,並解釋爲什麼?
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
&a是數組指針,其類型爲int (*)[5]。&a+1不是首地址+1,系統會認爲加一個a數組的偏移,是偏移了一個數組的大小,即5*sizeof(int),所以ptr實際是a[5]。但是prt與(&a+1)類型是不一樣的,prt-1只會減去sizeof(int*)。a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址。a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]。
20、請問以下代碼有什麼問題?
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
沒有爲str分配內存空間,將會發生異常
問題出在將一個字符串複製進一個字符變量指針所指地址。雖然可以正確輸出結果,但因爲越界進行內在讀寫而導致程序崩潰。