課堂筆記:
需強(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)
指針類型,空類型/voidsizeof()計(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)
(全部已完成)