手撕C語言理論知識(上)粗略講解C語言的部分入門知識-創(chuàng)新互聯(lián)

我的主頁:一只認(rèn)真寫代碼的程序猿
歡迎您來!希望點(diǎn)贊、收藏、評論、加關(guān)注
本文章是關(guān)于C語言的入門知識及細(xì)節(jié)的講解
收錄于專欄【C語言的學(xué)習(xí)】

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的羅平網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

目錄

C語言的一些基礎(chǔ)知識

操作符簡介

Scanf的%[ ]

語句(分支、循環(huán)、goto)

函數(shù)

數(shù)組



C語言的一些基礎(chǔ)知識
  • 主函數(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í)數(shù)
    %o - 八進(jìn)制? %x - 十六進(jìn)制輸出整數(shù) / 字符串地址
    %g自動選擇f和e格式且不輸出無意義的0
  • “%-nd”,左對齊,m如果小于實(shí)際長度,則忽略
    “%n.xs" 輸出n個字符,取字符串的前x位,左邊補(bǔ)空格
    "%n.mf"總長度位n,小數(shù)點(diǎn)后有m位 在編譯器上打印時,小數(shù)點(diǎn)后輸出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ù)點(diǎn)
    double 雙精度,占8字節(jié),64位,有效位數(shù)為16位,15小數(shù)+小數(shù)點(diǎn)
  • 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中使用,因?yàn)樗型獠挎溄訉傩?,但是被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)義字符。在計(jì)算字符串長度的時候 \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垂直制表符
\dddddd表示1~3個八進(jìn)制的數(shù)字
\xdddd表示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計(jì)算 變量/類型 所占空間大小,單位字節(jié)。計(jì)算類型時必須加括號
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è)計(jì)",20};
    b.price=10;
    strcpy(b.name,"C語言書籍");
    printf("%d\n",b.price);
    printf("%s",b.name);
}

Scanf的%[ ]

在輸入字符時,scanf 遇到空格、回車等結(jié)束符都是會讀取的。

除了加一個getchar()之外,另一個方法就是scanf的%[]

scanf("%[^\n]", arr1);//回車之前的字符串都讀取
	scanf("%[a-z]", arr2);//只讀取a-z的字符,碰到非此字符及停止
    //例如:arr2輸入abcd123,只讀取abcd

語句(分支、循環(huán)、goto)

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,實(shí)際上default可以隨便放哪,只是一般放在最后。
continue語句是不可以在單獨(dú)的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之后的分號 “ ; ”

計(jì)算前n項(xiàng)的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ì)算機(jī)起始時間(1970.1.1.0:00)換算成秒
srand(time(NULL))
代碼:

#include
#include
#include

int 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ù)

常用庫函數(shù):IO函數(shù)、字符串操作函數(shù)、內(nèi)存操作函數(shù)、時間函數(shù)、數(shù)學(xué)函數(shù)、其他

函數(shù)參數(shù):
實(shí)際參數(shù)(實(shí)參):真實(shí)傳給函數(shù)的參數(shù)。可以是常量、變量、表達(dá)式、函數(shù)等。無論實(shí)參是什么類型,它都必須有確定的值,以便于把值傳給形參。
形式參數(shù)(形參):函數(shù)名后面括號里的變量,之所以叫形參是因?yàn)橹挥性诤瘮?shù)被調(diào)用的過程中才實(shí)例化(分配內(nèi)存),因此,形參只有在函數(shù)中才有效。
在交換函數(shù)中,可以理解為形參只是實(shí)參的一份臨時拷貝,改變形參不會改變實(shí)參。

函數(shù)調(diào)用:
傳值調(diào)用:函數(shù)的形參和實(shí)參分別占不同內(nèi)存塊,修改形參不改變實(shí)參。
傳址調(diào)用:把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳給函數(shù)參數(shù)。這種傳參方式可以讓函數(shù)和函數(shù)外的變量建立起真正的聯(lián)系。
注意:不能在函數(shù)內(nèi)部計(jì)算數(shù)組元素個數(shù),因?yàn)閭鬟^去的數(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ù)的具體實(shí)現(xiàn)、函數(shù)功能實(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)缺點(diǎn):結(jié)構(gòu)清晰,代碼簡潔;但是可能會導(dǎo)致棧溢出、產(chǎn)生很多重復(fù)計(jì)算導(dǎo)致效率低、不停地調(diào)用函數(shù)需要消耗時間和空間導(dǎo)致效率低。

正序打印一個整型數(shù)字的每一位、不創(chuàng)建臨時變量求字符串長度、求n!、計(jì)算第n個斐波那契數(shù)、漢諾塔、青蛙跳臺階....


數(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()計(jì)算變量、數(shù)組、類型的大小,單位是字節(jié) - 操作符
strlen()求字符串長度,針對字符串 - 庫函數(shù)

零碎知識點(diǎn):

1、 一維數(shù)組和二維數(shù)組在內(nèi)存中都是連續(xù)存放的
2、二維數(shù)組初始化:行可以省略,列不能省略( int arr[ ][4] )
當(dāng)你省略了行數(shù),確定了列數(shù),計(jì)算機(jī)會根據(jù)你的列數(shù)以及你初始化時設(shè)定的數(shù)據(jù),自動確定行數(shù)。如果你省略了列數(shù),編譯器的尋址方式是array+?n * i?+ j(第n行第j列),由于沒有行數(shù),無法確定i的大小,所以計(jì)算機(jī)此時不知道該如何分配數(shù)據(jù)。
3、二維數(shù)組就當(dāng)做多個一維數(shù)組來理解就好了。
4、千萬不要在自定義函數(shù)內(nèi)部計(jì)算數(shù)組的個數(shù),計(jì)算值始終為1
void fac(int*arr)
{int sz=sizeof(arr)/sizeof(arr[0]);}
由于傳過來的是首元素地址,所以二者都是指針,大小為4/8,相除為1.
5、數(shù)組名是首元素地址(兩個例外如下)
sizeof(數(shù)組名),計(jì)算整個數(shù)組的大小,sizeof內(nèi)部單獨(dú)放一個數(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)查看詳情吧

本文名稱:手撕C語言理論知識(上)粗略講解C語言的部分入門知識-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article12/csjsgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃建站公司、微信小程序、ChatGPT網(wǎng)站排名、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)