教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

c/c++培訓(xùn)C語言核心知識總結(jié)(一)

更新時間:2016年10月21日16時26分 來源:傳智播客C++培訓(xùn)學(xué)院 瀏覽次數(shù):

C語言核心知識點(diǎn)相關(guān)總結(jié)(原創(chuàng))
 
 
零:聲明、定義、初始化
 
聲明:extern 可以置于變量或者函數(shù)前面,提示編譯器遇到這個變量或者函數(shù)的時候,在其他/當(dāng)前模塊里尋找。
extern int a; // b.c 有個全局變量a,那么可以在a.c里聲明這個a,然后拿過來用,但是并不代表我重新定義了一個a
extern int function(int a, double b, char c);
// 注意:函數(shù)在進(jìn)行聲明的時候,extern 是默認(rèn)可以省略的。
 
定義:沒有加上 extern 就是定義了。定義后的變量是有存儲空間的,可以獲取到這個變量的地址,但是不一定有值。
int a;
int arr[10];
 
初始化:定義變量的同時進(jìn)行賦值操作。
int a = 10;
int arr[10] = { 0 };
 
 
數(shù)據(jù)類型:
在C語言里的數(shù)據(jù)類型分為四大種:
1. 基本類型
在不同平臺下所占字節(jié)數(shù):
Linux 64 Windows 64 Linux 32 Windows 32
字符: char 1 1 1 1
 
整型: short 2 2 2 2
int 4 4 4 4
long 8 4 4 4
long long 8 8 8 8
size_t 8 8 4 4
 
浮點(diǎn)型: float 4 4 4 4
(實(shí)型)double 8 8 8 8
 
2. 構(gòu)造類型
數(shù)組:存儲了n個相同基本類型的數(shù)據(jù),舉例:sizeof(int) * n 個字節(jié)大小
char str1[5] = "haha"; // 只要用" "括起來的就是字符串,只要是字符串最后一位就是'\0'
char str2[5] = {'h', 'a', 'h', 'a', 'h'};
str1[2] = 'm';
printf("%s\n", str1);
 
int iarr[5] = {1, 2, 3, 4, 5};
float farr[5] = {1.1, 2.2, 3.14, 4.15, 5.001};
 
結(jié)構(gòu)體:存儲了n個可以不相同基本類型的數(shù)據(jù)  struct
聯(lián)合體/共同體: 存儲n個可以不相同基本類型的數(shù)據(jù),但是這種類型里的所有數(shù)據(jù)共享同一塊內(nèi)存空間,內(nèi)存大小是最大的那個數(shù)據(jù)類型大小 union
枚舉:存儲了n個相同基本類型的數(shù)據(jù),但是使用的時候只能取其中一個值,內(nèi)存大小是 sizeof(int); enum
 
3. 指針類型    32位占4個字節(jié),64位占8個字節(jié)
int *p;   // 指針類型變量p就是用來存儲地址的,定義指針時候的數(shù)據(jù)類型,代表這個指針指向的內(nèi)存空間里存儲的值的類型
int a = 10;
p = &a;
*p = 20;
printf("%d\n", a);
 
char *str = "haha"; // char *str 和 char str[5] 都是存儲字符串,但是str是一個指針,str是一個數(shù)組名
printf("%s\n", str); // char str[5] 存儲的"haha"是在棧區(qū), char *str 指向的 "haha" 是在常量區(qū),str存儲的是這個字符串在常量區(qū)的首地址。
*(str + 1) = 'm'; // 錯誤!!  因?yàn)閟tr里的內(nèi)容保存在常量區(qū),所以里面的值不可以修改。
 
4. 空類型
void 變量 :意思是空類型變量,不接受任何數(shù)據(jù)
void 函數(shù) :意思是該函數(shù)沒有返回值
void 指針 :意思是可以接收任何其他類型的指針
 
 
一、 字符串函數(shù)  <string.h>
1 strlen(char *str);
這個函數(shù)返回值是一個字符串的有效長度(除去'\0'),  有別于 sizeof() 運(yùn)算符;
 
2 strnlen(char *str, int maxlen);
這個函數(shù)是返回 maxlen 長度以內(nèi)、不含'\0'的字符串的長度。
 
3 strcat(char *str1, char *str2);
將參數(shù)str2 追加到 str1的后面(覆蓋str1后面的'\0')
 
4 strncat(char *str1, char *str2, int maxlen);
將參數(shù)str2 追加到 str1的后面,但是只追加str2的前maxlen個字節(jié)長度的字符串。
 
5 strcmp(char *str1, char *str2);
按字符依次比較兩個字符串,直到遇到不同的字符為止:
如果str1大于str2,返回正數(shù)(Windows下是返回1,Linux下是返回兩個不同字符串的ascii碼差值)
如果str1小于str2,返回負(fù)數(shù)(Windows下是返回-1,Linux下是返回兩個不同字符串的ascii碼差值)
如果兩個字符串相等,返回 0
 
舉例: str1 = "abcde"; str2 = "c";
strcmp(str1, str2);  返回值是(Windows下是返回-1,Linux下是返回兩個不同字符串的ascii碼差值: -2)
 
6 strncmp(char *str1, char *str2, int maxlen);
和 strcmp()函數(shù)返回值相同,但是只比較前 maxlen 個字符;
 
7 strcpy(char *str1, char *str2);
將參數(shù) str2 的字符串拷貝到參數(shù) str1 里面。(拷貝的字符包括'\0')
 
8 strncpy(char *str1, char *str2, int maxlen);
將參數(shù) str2 的前 maxlen 個字符拷貝到 str1 里。
 
9 strchr(char *str, char ch); //原來是 int ch,但是函數(shù)在調(diào)用的時候,會轉(zhuǎn)換成char ch
在str中查找指定字符ch,如果找到的話返回ch在str中的位置,如果沒找到,返回 NULL // (void*) 0
 
10 strstr(char *str1, char *str2);
在str1中查找指定字符串str2,如果找到的話返回str2在str1中的位置,如果沒找到,返回 NULL
 
11 strtok(char *str, char delim);
分解字符串 str 為一組字符串子串,用delim做為字符串的分隔符。
strtok()函數(shù)每次分隔會把分隔符的位置置為 '\0', 同時會破壞原先字符串的完整性;
調(diào)用函數(shù)前的字符串和調(diào)用函數(shù)后的字符,已經(jīng)不一樣了。所以我們在做字符串分隔的時候,更推薦使用 sscanf();
 
 
12 sscanf(char *str, char *format, argument...);
scanf()函數(shù)是從鍵盤上讀取用戶輸入,然后把值寫到變量里;
sscanf()函數(shù)是從str里讀取數(shù)據(jù),按照format格式,將數(shù)據(jù)寫入到變量里。
返回值是成功寫入的數(shù)據(jù)數(shù)量;
 
int a, b, c;
char s1[10] = { 0 };
char s2[10] = { 0 };
char s3[10] = { 0 };
sscanf("2016-05-31", "%d - %d - %d", &a, &b, &c);
// 按照 %d - %d - %d 的格式分隔,把2016、05、31 這三個整數(shù)寫入到a、b、c里
sscanf("2016 - 05 - 31", "%s - %s - %s", s1, s2, s3);
//  按照 %s - %s - %s 的格式分隔,把2016、05、31 這三個字符串寫入到s1、s2、c里
// %s 匹配一串非空白字符,從輸入字符中的第一個非空白字符開始匹配到下一個空白字符之前,
//   或者匹配到指定的寬度,賦值參數(shù)的類型是char *,末尾自動添加'\0'。
 
 
13 sprintf(char *str, char *format, argument...);
printf()函數(shù)是把格式化后的結(jié)果輸出到屏幕上;
sprintf()函數(shù)是把格式化后的結(jié)果寫入到字符串str里;
返回值是 str被寫入的字節(jié)數(shù),不包括'\0';
 
char i[10] = "I";
char you[10] = "You";
char str[100] = { 0 };
 
sprintf(str, "%s love %s", i, you);
// 輸出字符串"I love You"到字符串 str 里
sprintf(str, "%10.3f", 0.1234567);
// 輸出字符串 "     0.123" 到字符串 str 里(原先的內(nèi)容會被清空)
 
 
14 字符串轉(zhuǎn)換函數(shù) <stdlib.h>
atoi();
把一個 char 類型的數(shù)組轉(zhuǎn)換成一個 int.
itoa()把一個 int 類型的數(shù)字轉(zhuǎn)換成char類型的字符串(只能在Visual C++ 編譯器下使用);
// Linux是沒有的
atoll();
把一個 char 類型的數(shù)組轉(zhuǎn)換成一個 long long.
 
atof();
把一個 char 類型的數(shù)組轉(zhuǎn)換成一個 double.
 
舉例:
char str[10] = ".....";  //int float long long
int / double / long long n = atoi(str) / atof(str) / atoll(str);
printf("%d / %lf / %ld\n", n);
本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/c/ 
0 分享到:
和我們在線交談!