iOS開發入門 ☞ C言語(關鍵字、字符串面試題)。本站提示廣大學習愛好者:(iOS開發入門 ☞ C言語(關鍵字、字符串面試題))文章只能為提供參考,不一定能成為您想要的結果。以下是iOS開發入門 ☞ C言語(關鍵字、字符串面試題)正文
全局變量:定義在函數體內部(包括main函數),其作用域為整個順序(可以在任何函數中訪問)
extern int global; //聲明一個全局變量。相當於通知編譯器,你別管啦,這是個全局變量,我保證他是存在的。
static int global = 200; //全局靜態變量(靜態的只允許本文件外部訪問)
1)定義在函數外部(包括:函數的參數、if、for、while外面定義的變量)
2)定義在復合語句(代碼塊{……})中
auto int a; //由關鍵字auto聲明,可以省略。內存空間是自動分配,(出了作用域)自動釋放!
static int a; //變量a在全局區分配空間,函數完畢時分,內存不會釋放。
※ 不論調用函數多少次,這條語句只執行一次,即第一次執行,內存空間不受函數的控制。
※ 靜態部分變量的生命周期和全局變量一樣,都是整個順序運轉時期!
※ 部分變量在沒有初始化的狀況下是一個隨機數據(渣滓值)
auto關鍵字auto int x;//自動變量,部分變量(auto默許省略)
auto 只能修飾部分變量,不能修飾全局變量!
static關鍵字1. 修飾部分變量:生命周期變長(整個順序運轉時期),作用域不變(和普通變量一樣)
static修飾的部分變量,其數值就是上一次函數調用完畢之後的數值!
擴展(用處):可以記載一個函數被調用了多少次!
//計數器函數,記載被調用的次數
int count() {
static int cnt = 0; //不論調用多少次函數,這條語句只會執行一次
cnt++;
return cnt;
}
2. 修飾全局變量:只能在本文件外部訪問,其它文件不能訪問。維護全局變量。
//靜態的只允許本文件外部訪問
static int global = 200;//全局靜態變量
3. 修飾函數:也是只能在本文件中訪問,其它文件都不能訪問!
//此函數為公有函數,只允許本文件外部調用,別的文件中無法調用
static void func(){
printf("這是本文件外部函數,其它文件中無法調用!\n");
}
舉例:運用static修飾部分變量,檢查特性。
比照之下,可以看出運用static修飾的部分變量的特性,訪問范圍和普通的部分變量一樣,但是在函數執行終了之後其數值並不會釋放。
const關鍵字
const修飾的變量:只讀變量(常量),不可修正變量的數值!
register、volatile
//存放器變量,僅僅是請求一下,編譯器不一定同意
register int x = 10;//CPU, 實際上存取速度十分快
//易變的變量,編譯器讀取時不要做優化處置,除非在嵌入式開發中運用傳感器改動變量的值時
volatile int y = 20;
運用 extern 關鍵詞聲明另一個文件定義的全局變量
extern int global; //聲明一個全局變量。相當於通知編譯器,你別管啦,這是個全局變量,我保證他是存在的。
extern void sum(); //內部函數的聲明。
static void minus(); //外部函數的聲明
字符串面試題
/**
* 完成字符串常用的4個庫函數
*/
#include <stdio.h>
#include <assert.h>
/** 完成strlen函數 */
int mystrlen(char *arr) {
int count = 0;//定義變量記載取出了多少個字符
while(arr[count] != '\0') {
count++;
}
return count;
}
/** 完成strcat函數 */
char *mystrcat(char *str1, const char *str2) {
char *tmp = str1;
while(*str1)
str1++;
while((*str1++ = *str2++) != '\0');
return tmp;
}
/** 完成strcpy函數 */
char *mystrcpy(char *str1, const char *str2) {
assert(str1 != NULL && str2 != NULL);//斷言函數,反省參數的無效性(防錯設計)
char *tmp = str1;
//*str2對*str1逐一字符停止賦值
//*str2直到把'\0'賦值給*str1時,*str1的後果就是0,循環就完畢!
while((*str1++ = *str2++));
return tmp;
}
/** 完成strcmp函數 */
int mystrcmp(char *str1, char *str2) {
assert(str1 != NULL && str2 != NULL);
while(*str1 == *str2 && *str1 != '\0') str1++, str2++;
if(*str1 > *str2) {
return 1;
} else if(*str1 < *str2) {
return -1;
} else {
return 0;
}
}
int main() {
char str1[] = "hello";
char *str2 = "world";
printf("%d\n", mystrlen(str1));//str1的長度為:5
printf("%s\n", mystrcat(str1, str2));//拼接後:helloworld
printf("%s\n", mystrcpy(str1, "ABCDE"));//拷貝(掩蓋):ABCDEF
printf("%d\n", mystrcmp(str1, str2)); //-1(str1 < str2)
return 0;
}
//字符串賦值(拷貝)
void Strcpy(char *s1, const char *s2)
{
//while(*s1++ = *s2++);
while (*s2 != '\0') {
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0';
}
//字符串銜接
void Strcat(char *s1, const char *s2)
{
while(*s1)s1++;
//while(*s1++ = *s2++);
while(*s2){
*s1 = *s2;
s1++;
s2++;
}
*s1 = 0;
}
//字符串長度
int Strlen(const char *str)
{
int cnt = 0;//保管後果
while (*str) {
cnt++;
str++;
}
return cnt;
}
//字符串比擬
int Strcmp(const char *s1, const char *s2)
{
while(*s1 || *s2){
if(*s1 > *s2) return 1;
else if(*s1 < *s2) return -1;
s1++;
s2++;
}
return 0;
}
有一個字符串"abcd1234",請寫一個函數,將此字符串拆成兩局部, abcd保管到char str[10]中,1234保管到變量int x中:
int str2int(char *str, char *s){
//....
}
int main()
{
char *source = "abcd1234";
char str[10] = {0};
int x = 0;
x = str2int(cource, str);
}