C高級(jí)預(yù)習(xí)(6)和C語(yǔ)言基礎(chǔ)(1)

課堂筆記:

需強(qiáng)化記憶的有:

  • C語(yǔ)言之父:丹尼斯*里奇
    #:預(yù)處理命令
    include:頭文件的包含
    <>:把括號(hào)里面的內(nèi)容引入到原文件中
    stdio.h :頭文件,是計(jì)算機(jī)自帶的庫(kù),可以直接使用
    main:函數(shù)名,main()是主函數(shù),C程序源文件有且只能有一個(gè)
    main()即主函數(shù)?。?!C橫須的入口,即所有的c程序都是從main()開始執(zhí)行!!!
    char \*argv[]記錄參數(shù)
    int argc:參數(shù)的個(gè)數(shù)
    return 0返回,或函數(shù)結(jié)束。

  • 數(shù)據(jù)類型
    字符型(char):由’‘引起來的單個(gè)字母,數(shù)字或其他符號(hào)例如 ’e‘ 'l' 'i'等都是字符。
    getchar():獲取單個(gè)字符,
    putchar():輸出單個(gè)字符,
    實(shí)型/浮點(diǎn)型(float double):float單精度,有效位7位左右 ,double/雙精度有效位15位左右。
    構(gòu)造數(shù)據(jù)的類型,數(shù)據(jù)類型,結(jié)構(gòu)體(struct),聯(lián)合體(union)
    指針類型,空類型/void

  • sizeof()計(jì)算數(shù)據(jù)類型或者變量所在內(nèi)存空間的大小,字節(jié)數(shù)。

sizeof()                    DateType
sizeof(char)                    1
sizeof(short)                   2
sizeof(int)                     4
sizeof(float)                   4
sizeof(long)                    8
sizeof(double)                  8
  • 逗號(hào)表達(dá)式:
    表達(dá)式1,表達(dá)式2,表達(dá)式3,...;
    表達(dá)式會(huì)依次執(zhí)行,但是逗號(hào)表達(dá)式的值以最后一個(gè)表達(dá)式為準(zhǔn)。
#include<stdio.h>
int main(int argc,char *argv[]){
    int a = 3;
    a + 2,a*3,a-5;
    printf("a = %d\n",a);//3
    printf("%d\n",(a+2,a*3,a-5));//-2
    printf("%d\n",((a = a+4),(a*2,a/3)));//2
    return 0;
}
  • i++和++I的細(xì)節(jié)(代碼示例):
#include<stdio.h>
int main(){
    int num = 5;
    int sum1 = ++num + num++;//13
    num = 5;
    int sum2 = num++ + num++;//11
    num = 5;
    int sum3 = num++ + ++num;//12
    num = 5;
    int sum4 = ++num + ++num;//14
    printf("%d\t%d\t%d\t%d\n",sum1,sum2,sum3,sum4);
    return 0;
}

C高級(jí)的預(yù)習(xí)

  • 1,指針函數(shù)
    返回類型標(biāo)識(shí)符 *返回名稱(形式參數(shù)表){函數(shù)體}
    (每一個(gè)函數(shù),他自身都有一個(gè)入口地址,該地址相當(dāng)于一個(gè)指針。返回值相當(dāng)于返回了一個(gè)指針變量的值,不過這是的“變量”時(shí)函數(shù)本身
#include<stdio.h>
float *find();
int main(int argc,char **argv[])
{
    static float score[][4] = {{60,70,80,90},{56,89,34,45},{34,23,56,45}};
    float *p;
    int i,m;
    printf("Enter the number to be found:");
    scanf("%d",&m);
    printf("the score of NO.%d are:\n",m);
    p = find(score,m);
    for(i = 0;i < 4;i++)
        printf("%5.2f\t",*(p+i));
}
float *find(float (*pionter)[4],int n){
    float *pt;
    pt = *(pionter+n);
    return (pt);
}

自己將函數(shù)重新默寫了一遍,在書上查找不懂得地方,大大加深了自己對(duì)指針的理解,以及指針函數(shù)的認(rèn)識(shí)。

  • 2,函數(shù)指針
    數(shù)據(jù)類型標(biāo)識(shí)符 (*指針變量名) (參數(shù))
    指向函數(shù)的指針變量,和指針變量指向其他數(shù)據(jù)類型類似,此處指向函數(shù)的入口地址。
#include<stdio.h>
int max(int x,int y){
    return (x>y?x:y);
}
void main(int argc,char *argv[]){
    int (*ptr)();
    int a,b,c;
    ptr = max;
    scanf("%d,%d",&a,&b);
    c = (*ptr)(a,b);
    printf("a=%d,b=%d,max=%d",a,b,c);
}

此處ptr指向max函數(shù)的入口地址,運(yùn)行時(shí)和max函數(shù)無任何區(qū)別,函數(shù)指針可以隨意指向任何一個(gè)函數(shù),而不像函數(shù)那樣名稱被固定了,但函數(shù)指針沒有++和--。

  • 3,函數(shù)指針的用法:
    1)定義函數(shù)指針變量:
    typedef int (*PTRFUN) (int aPara);
    2)函數(shù)指針變量的定義:
int (*pFun2) (int a);```
3)函數(shù)指針作為函數(shù)的參數(shù)傳遞:

typedef int (PTRFUN) (int aPara);
int CallBack(int a){
return ++a;
}
void Caller(PTRFUN cb)
//void Caller(int (
cb) (int))//也可以這樣聲明
{
int nPara = 1;
int nRet = cb( nPara);
}
//使用回調(diào)
void Test(){
Caller(CallBack);//直接調(diào)用回調(diào)函數(shù)
PTRFUN cb = CallBack;//int (*cb)(int);cb = CallBack;
int nRet1 = cb(99);//nRet1 = 100;
}```
使用函數(shù)指針的方法,在再一次的對(duì)用函數(shù),(回調(diào)函數(shù))
4)函數(shù)指針數(shù)組的使用

PTRFUN fArray[10];
//int (*fArray[10] (int));
for(int i = 0;i < 10;i++){
fArray[i] = CallBack;
int nRet = fArray[i](i);
}

5)函數(shù)指針的大小
int nSz1 = sizeof(PTRFUN);//nSz1 = 4;

數(shù)組于動(dòng)態(tài)申請(qǐng)

malloc和free應(yīng)該成對(duì)出現(xiàn),否則容易出現(xiàn)系統(tǒng)崩潰,代碼編寫應(yīng)該采用誰(shuí)申請(qǐng),就由誰(shuí)調(diào)用比如:

char *p = malloc(...);
if(p==NULL)
...;
function(p);
...
free(p);
p=NULL;
直接定義函數(shù)對(duì)p進(jìn)行操作。
void founction(char *p)
{
/*對(duì)p的一系列操作*/
}

void指針和空指針

  • 空指針是NULL,NULL是在<stdlib.h>中定義的一個(gè)宏。(不能間接引用一個(gè)空指針).

1)空指針終止對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用

#include<stdio.h>
unsigned factorial(unsigned i);
int main(int argc,char *argv[]){
    unsigned i;
    printf("input i:\n");
    scanf("%u",&i);
    int a = factorial(i);
    //int a = 5;
    printf("%d\n",a);
    return 0;
}
unsigned factorial(unsigned i){
    if(i == 0||i == 1){
        return 1;
    }else{
        return i * factorial(i-1);
    }
}

常見的遞歸數(shù)據(jù)結(jié)構(gòu)是(單向)鏈表,鏈表中的每一個(gè)元素和一個(gè)指向鏈表中下一個(gè)元素的指針。可以通過指向第一個(gè)元素的指針開始引用一個(gè)鏈表,每一個(gè)元素指向下一個(gè)鏈表;當(dāng)是指向最后一個(gè)元素的指針被賦值為NULL;就可以終止對(duì)鏈表的引用了。

while(p! = NULL){
/*d0 something with p-->str*/
p=p-->next;
}

2)用空指針作函數(shù)調(diào)用失敗時(shí)的返回值

(。。。明天繼續(xù)更新)

作業(yè)

1,熟悉并掌握printf()和scanf()的用法,及scanf()函數(shù)易碰到的問題
2,掌握幾種基本數(shù)據(jù)類型及使用方法
3,使用算術(shù)運(yùn)算符進(jìn)行簡(jiǎn)單的四則運(yùn)算及混合運(yùn)算
4,逗號(hào)表達(dá)式的使用
5,預(yù)習(xí)邏輯運(yùn)算符,位操作運(yùn)算符,分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)
(全部已完成)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容