我的主頁:一只認(rèn)真寫代碼的程序猿
歡迎您來!希望點贊、收藏、評論、加關(guān)注
本文章是關(guān)于C語言的入門知識及細(xì)節(jié)的講解
收錄于專欄【C語言的學(xué)習(xí)】
目錄
C語言的一些基礎(chǔ)知識
操作符簡介
Scanf的%[ ]
語句(分支、循環(huán)、goto)
函數(shù)
數(shù)組
- 主函數(shù) - 程序的入口 - main函數(shù)有且僅有一個。
- char - short - int - long - long long - float - double
- %d - 十進(jìn)制整型? ?%u - 無符號整型
%c - 字符? %s - 字符串
%ld - long類型
%p - 地址
%f - float類型? %lf - double類型
%e - 指數(shù)形式輸出實數(shù)
%o - 八進(jìn)制? %x - 十六進(jìn)制輸出整數(shù) / 字符串地址
%g自動選擇f和e格式且不輸出無意義的0- “%-nd”,左對齊,m如果小于實際長度,則忽略
“%n.xs" 輸出n個字符,取字符串的前x位,左邊補(bǔ)空格
"%n.mf"總長度位n,小數(shù)點后有m位 在編譯器上打印時,小數(shù)點后輸出6個0- 數(shù)據(jù)類型
char? ?字符數(shù)據(jù)類型1字節(jié)
short? 2字節(jié)
int? ? ? ?4字節(jié)
long? ? 4字節(jié)/8字節(jié),取決于平臺( C標(biāo)準(zhǔn)規(guī)定sizeof(long) >sizeof(int) )
long long? ?8字節(jié)
float? ? ?單精度, 占4字節(jié),32位,六位小數(shù)+小數(shù)點
double 雙精度,占8字節(jié),64位,有效位數(shù)為16位,15小數(shù)+小數(shù)點- bit - 比特 - 最小單位? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byte - 字節(jié) - 1個字節(jié)是8個比特位,可以放8個二進(jìn)制位? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1kb - 1024byte
- float x = 9.6; 編譯器會默認(rèn)小數(shù)是double類型 --> float x = 9.6f;
- 局部變量的作用域(scope)是它所在的代碼塊,也就是它所在的{}內(nèi)。? ? ? ? ? ? ? ? ? ? ? ? ? (局部變量,是指在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義的變量)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果全局變量和局部變量同名,那么局部變量優(yōu)先。全局變量的作用域是整個工程(另一處使用時只需extern聲明一下就可以了)全局變量之所以能在其他.c中使用,因為它有外部鏈接屬性,但是被static修飾之后,變成了內(nèi)部鏈接屬性,其他.c文件不能鏈接到
這個靜態(tài)的全局變量了。- 常量有:
1、字面常量
2、const修飾的常變量
3、#define定義的標(biāo)識符常量: #define Max 10
4、枚舉常量
字符串:由雙引號(Double Quote)引起來的一串字符稱為字符串字面值(String Literal),或者簡稱字符串。
注:字符串的結(jié)束標(biāo)志是一個 \0 的轉(zhuǎn)義字符。在計算字符串長度的時候 \0 是結(jié)束標(biāo)志,不算作字符串內(nèi)容
“”是一個空字符串
字符數(shù)組——數(shù)組是一組相同類型的元素
char arr[]={ 'a','b','c' ,'\0'或0}
'\0' -->轉(zhuǎn)義字符 - 0 - ASCII是0? ? ? ? 0 -->數(shù)字0? ? ? ? '0' -->字符0,ASCII是48
轉(zhuǎn)義字符 | 作用 |
換行 | |
\r | 回車 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3個八進(jìn)制的數(shù)字 |
\xdd | dd表示2個十六進(jìn)制數(shù)字 |
\? | 書寫連續(xù)多個問號時使用,防止解析成三字母詞(??+char) |
\' | 字符常量' |
\“ | 表示一個字符串內(nèi)部的雙引號 |
\\ | 表示一個反斜杠,防止它被解釋為一個轉(zhuǎn)義序列符 |
\a | 警告字符,蜂鳴 |
\b | 退格符 |
\f | 進(jìn)紙符 |
16進(jìn)制:數(shù)字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)
printf("%d",'\130'); // 輸出8
printf("%d",'\x30');// 輸出48
printf("%d\n", strlen("\628\test.c:\testc"));? ? //輸出14
printf("%d\n", strlen("\\628\\test.c:\\testc")); //輸出18
輸出單個斜杠:
printf("%c",' ' ');//error,前面兩個變成一對,后面落單
printf("%c",'\'');//正確
算術(shù)操作符:加減乘除模
移位操作符:左移<< 和 右移>>
位操作符:與&(相同才為1)、或|(有1就1)、異或^(相同則0)
賦值操作符:=? ? +=? ? -=? ? *=? ? /=? ? &=? ? ^=? ? ?|=? ? ? >>=? ? ?<<=
單目操作符:
! ? ? ? ? ? 邏輯反操作
- ? ? ? ? ? 負(fù)值
+ ? ? ? ? ? 正值
& ? ? ? ? ? 取地址
sizeof? ? ? ? 操作數(shù)的類型長度(以字節(jié)為單位)
~? ? ? ? ? ? ? ?對一個數(shù)的二進(jìn)制按位取反
--? ? ? ? ? ? ? ?前置、后置--
++? ? ? ? ? ? ?前置、后置++
*? ? ? ? ? ? ? ? 間接訪問操作符(解引用操作符)
(類型)? ? ? ? 強(qiáng)制類型轉(zhuǎn)換關(guān)系操作符:
>
>=
<
<=
!=? ?測試不相等
==? ? ? 測試相等邏輯操作符:與&&(遇到假就停止,后面表達(dá)式不執(zhí)行),或||(遇到真就停止)
條件操作符: exp1?exp2:exp3
逗號表達(dá)式: exp1,exp2,...expn
下標(biāo)引用:[]? ? ? ? 函數(shù)調(diào)用:()? ? ? ? 結(jié)構(gòu)成員: . ->
sizeof計算 變量/類型 所占空間大小,單位字節(jié)。計算類型時必須加括號
int a = 10;? ? ? ? int arr[10]={0};?
printf("%d\n",sizeof(int));//4
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof a);//4
printf("%d\n",sizeof int);//error
printf("%d\n",sizeof arr);//40
按位取反~
int a=0; int b=~a;
printf("%d",b);//輸出-1
負(fù)數(shù)在內(nèi)存中存儲的時候,是二進(jìn)制的補(bǔ)碼。使用時,打印的是這個數(shù)的原碼(原,反,補(bǔ))
常見關(guān)鍵字:auto? break ? case ?char ?const ? continue ?default ?do ? double else ?enum ? extern float ?for ? goto ?if ? int ? long ?register ? ?return ? short ?signed sizeof ? static struct ?switch ?typedef union ?unsigned ? void ?volatile ?while
auto:現(xiàn)在一般都省略了,auto int a =10;
register:建議把某個變量放到寄存器內(nèi),是否存放進(jìn)去由編譯器決定。
signed:有符號數(shù),signed int 和 int是等價的
typedef:類型重定義(typedef unsigned int u_int;? ? ? ? u_int a=5;)
static:
1、修飾局部變量 - 使局部變量的生命周期變長
2、修飾全局變量 - 改變?nèi)肿兞康淖饔糜?- 使靜態(tài)的全局變量只能在自己所在源文件內(nèi)部使用
3、修飾函數(shù) - 改變了函數(shù)的鏈接屬性,使其變成了內(nèi)部鏈接屬性(正常的函數(shù)有外部鏈接屬性)
#define定義標(biāo)識符常量和宏:
#define MAX 100
#define? ADD(x,y)? (x+y)
宏定義中的宏名一般用全大寫用于區(qū)分,宏定義不是C語言語句,不要加分號!
#define命令出現(xiàn)在程序中函數(shù)的外面(不能在函數(shù)內(nèi))作用域:定義命令到源文件結(jié)束。
#undef命令可以結(jié)束宏定義(#undef MAX)這不是語句,沒有分號
宏定義只是預(yù)處理指令,只做字符的替換,而不分配內(nèi)存空間
函數(shù)結(jié)果有無括號是有區(qū)別的。
如果字符串中含有宏名,不進(jìn)行替換。
指針
指針變量的大小取決于地址的大小
32位平臺下地址是32個bit位(即4個字節(jié))
64位平臺下地址是64個bit位(即8個字節(jié))
int *pa = &a;指針的名字是p,類型是int*
結(jié)構(gòu)體
結(jié)構(gòu)體中字符串不能直接進(jìn)行修改,而是使用strcpy函數(shù)
#include#includestruct book
{
char name[20];
int price;
};
int main()
{
struct book b={"C語言設(shè)計",20};
b.price=10;
strcpy(b.name,"C語言書籍");
printf("%d\n",b.price);
printf("%s",b.name);
}
在輸入字符時,scanf 遇到空格、回車等結(jié)束符都是會讀取的。
除了加一個getchar()之外,另一個方法就是scanf的%[]
scanf("%[^\n]", arr1);//回車之前的字符串都讀取
scanf("%[a-z]", arr2);//只讀取a-z的字符,碰到非此字符及停止
//例如:arr2輸入abcd123,只讀取abcd
C語言中由一個分號隔開就是一條語句
1. 表達(dá)式語句
2. 函數(shù)調(diào)用語句
3. 控制語句
4. 復(fù)合語句
5. 空語句九個控制語句:
1. 條件判斷語句(分支語句):if、switch;
2. 循環(huán)執(zhí)行語句:do while、while、for;
3. 轉(zhuǎn)向語句:break、goto、continue、return
分支語句(選擇結(jié)構(gòu))
if語句條件判斷用“ == ”而不是 “ = ”。
建議把常量寫在左邊:if ( n==0 ) 寫成 if ( 0==n )
switch用于多分支情況,case后面必須跟整型,且中間有空格。
switch-case-break-default,實際上default可以隨便放哪,只是一般放在最后。
continue語句是不可以在單獨的switch語句中使用,但可以在一個循環(huán)內(nèi)的switch語句中使用
循環(huán)語句for、while、do while
while ( (ch=getchar()) != EOF) 輸入EOF,則ch=E,windows系統(tǒng)下,結(jié)束循環(huán)需要按下Ctrl+z
EOF的宏定義是#define EOF -1
由于ASCII碼值的范圍是0~255,所以,可以用EOF作為文件(這里一定要求是文本文件)結(jié)束標(biāo)志,或是作為輸入結(jié)束標(biāo)志。
在C語言里,NULL代表的是值為0的void型指針,稱為空地址,但NULL也有地址,它的作用是用來防止出現(xiàn)野指針的。?可以將NULL作為空指針常量使用,也可以寫成 int*p=0;
for(初始化,判斷,調(diào)整),for循環(huán)內(nèi)的continue是跳到調(diào)整部分;for循環(huán)中如果判斷部分省略,則判斷部分恒為真。
別忘了do-while之后的分號 “ ; ”
計算前n項的n階和(忘記重置)
#includeint main()
{
int n =0;
scanf("%d",&n);
int sum=1;
int s=0;
for(int j=1;j
二分查找
void binary_search(int x,int*arr,int sz)
{
int left=0;
int right=sz-1;
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]>x)
{
right=mid-1;
}
else if(arr[mid]right) printf("找不到");
}
Rand&Srand
rand()函數(shù)每次調(diào)用前都會查詢是否調(diào)用過srand(seed),如果有,會自動調(diào)srand(seed)來初始化它的起始值;如果沒有,系統(tǒng)會自動給seed賦初始值,即srand(1)自動調(diào)用它一次。一旦種子相同,每次的隨機(jī)數(shù)也就相同,所以用到時間戳給srand。
時間戳:當(dāng)前時間 - 計算機(jī)起始時間(1970.1.1.0:00)換算成秒
srand(time(NULL))
代碼:#include
#include
#includeint main()
{
srand((unsigned int)time(0));
int i = 0;
for(;i< 5;++i)
{
? int num = rand() % 100?+ 1;
? printf("%d ",num);
? }
printf("\n");
}srand函數(shù)在工程里只要調(diào)用一次就行了,不要把它放到自定義函數(shù)里多次調(diào)用。
goto語句
goto語句和標(biāo)記跳轉(zhuǎn)的標(biāo)號是可以隨意濫用的,但是除非是不得已的情況,不然不建議使用。goto語句最常見的用法是一次性跳出多層循環(huán)。
#include
#include
#include
int main()
{
? char input[15]={0};
? system("shutdown -s -t 60");
? again:
? printf("電腦將在60后關(guān)機(jī),輸入我是笨蛋就取消關(guān)機(jī):>\n");
? scanf("%s",input);
? if(0==strcmp(input,"我是笨蛋"))
? system("shutdown -a");
? else
? goto again;
}//可以用while循環(huán)替代這一整段代碼
常用庫函數(shù):IO函數(shù)、字符串操作函數(shù)、內(nèi)存操作函數(shù)、時間函數(shù)、數(shù)學(xué)函數(shù)、其他
函數(shù)參數(shù):
實際參數(shù)(實參):真實傳給函數(shù)的參數(shù)??梢允浅A?、變量、表達(dá)式、函數(shù)等。無論實參是什么類型,它都必須有確定的值,以便于把值傳給形參。
形式參數(shù)(形參):函數(shù)名后面括號里的變量,之所以叫形參是因為只有在函數(shù)被調(diào)用的過程中才實例化(分配內(nèi)存),因此,形參只有在函數(shù)中才有效。
在交換函數(shù)中,可以理解為形參只是實參的一份臨時拷貝,改變形參不會改變實參。
函數(shù)調(diào)用:
傳值調(diào)用:函數(shù)的形參和實參分別占不同內(nèi)存塊,修改形參不改變實參。
傳址調(diào)用:把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳給函數(shù)參數(shù)。這種傳參方式可以讓函數(shù)和函數(shù)外的變量建立起真正的聯(lián)系。
注意:不能在函數(shù)內(nèi)部計算數(shù)組元素個數(shù),因為傳過去的數(shù)組名是指針變量。
在函數(shù)中的sizeof(arr)/sizeof(arr[0])始終為1
嵌套調(diào)用與鏈?zhǔn)皆L問:
嵌套是指在應(yīng)該函數(shù)中調(diào)用另一個函數(shù);鏈?zhǔn)绞侵赴岩粋€函數(shù)的返回值作為另一個函數(shù)的參數(shù)。
printf("%d",printf("%d",printf("%d",43)));
輸出4321
printf("%d",printf("%d",printf("%s","ab")));
輸出ab21
printf的返回值是打印的字符個數(shù)
函數(shù)的聲明與定義:
函數(shù)聲明一般出現(xiàn)在函數(shù)使用之前,先聲明后使用;函數(shù)聲明一般放在頭文件.h中。
函數(shù)定義是指函數(shù)的具體實現(xiàn)、函數(shù)功能實現(xiàn)?
函數(shù)遞歸
棧溢出(stac overflow):棧區(qū)空間一般是局部變量、函數(shù)形參等;堆區(qū)空間動態(tài)內(nèi)存開辟;靜態(tài)區(qū)一般是全局變量、static。當(dāng)函數(shù)不停地調(diào)用自己的時候,會不停在棧區(qū)占用空間,最終導(dǎo)致棧溢出。
遞歸需要存在限制條件,當(dāng)條件成立時遞歸結(jié)束;同時每次遞歸調(diào)用之后都要不停接近這個條件。遞歸的優(yōu)缺點:結(jié)構(gòu)清晰,代碼簡潔;但是可能會導(dǎo)致棧溢出、產(chǎn)生很多重復(fù)計算導(dǎo)致效率低、不停地調(diào)用函數(shù)需要消耗時間和空間導(dǎo)致效率低。
正序打印一個整型數(shù)字的每一位、不創(chuàng)建臨時變量求字符串長度、求n!、計算第n個斐波那契數(shù)、漢諾塔、青蛙跳臺階....
創(chuàng)建數(shù)組時,方括號里只能是常量,不能是變量。
C89標(biāo)準(zhǔn):創(chuàng)建數(shù)組時,[ ]內(nèi)容必須是常量。
C99標(biāo)準(zhǔn):[ ]內(nèi)可以使用變量。
不完全初始化:int n[5]={1,2,3};后面元素默認(rèn)為0
sizeof()計算變量、數(shù)組、類型的大小,單位是字節(jié) - 操作符
strlen()求字符串長度,針對字符串 - 庫函數(shù)
零碎知識點:
1、 一維數(shù)組和二維數(shù)組在內(nèi)存中都是連續(xù)存放的
2、二維數(shù)組初始化:行可以省略,列不能省略( int arr[ ][4] )
當(dāng)你省略了行數(shù),確定了列數(shù),計算機(jī)會根據(jù)你的列數(shù)以及你初始化時設(shè)定的數(shù)據(jù),自動確定行數(shù)。如果你省略了列數(shù),編譯器的尋址方式是array+?n * i?+ j(第n行第j列),由于沒有行數(shù),無法確定i的大小,所以計算機(jī)此時不知道該如何分配數(shù)據(jù)。
3、二維數(shù)組就當(dāng)做多個一維數(shù)組來理解就好了。
4、千萬不要在自定義函數(shù)內(nèi)部計算數(shù)組的個數(shù),計算值始終為1
void fac(int*arr)
{int sz=sizeof(arr)/sizeof(arr[0]);}
由于傳過來的是首元素地址,所以二者都是指針,大小為4/8,相除為1.
5、數(shù)組名是首元素地址(兩個例外如下)
sizeof(數(shù)組名),計算整個數(shù)組的大小,sizeof內(nèi)部單獨放一個數(shù)組名,數(shù)組名表示整個數(shù)組。
&數(shù)組名,取出的是數(shù)組的地址。&數(shù)組名,數(shù)組名表示整個數(shù)組。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧