C語言入門(一)

1肌稻、c語言代碼結(jié)構(gòu)
c文件以.c結(jié)尾透且。

#include <stdio.h> // 導(dǎo)入標(biāo)準(zhǔn)庫,C99標(biāo)準(zhǔn)庫
// <>代表尋找系統(tǒng)的資源
// ''代表尋找我們自己寫的資源
// .h結(jié)尾代表聲明c語言頭文件矿筝, .hpp結(jié)尾代表聲明c++語言頭文件
// .c結(jié)尾代表實現(xiàn)c語言文件猛们,   .cpp結(jié)尾代表實現(xiàn)c++語言文件
int main() {
    printf("哈哈 Hello, World!");

//    getchar(); // getchar()會阻塞念脯,使程序一直處于運(yùn)行狀態(tài)
    return 0;
}

多個類不能有多個main方法,運(yùn)行會報錯弯淘。

FAILED: CProject 
: && /Library/Developer/CommandLineTools/usr/bin/cc -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/CProject.dir/T1.c.o CMakeFiles/CProject.dir/T2.c.o -o CProject   && :
duplicate symbol '_main' in:
    CMakeFiles/CProject.dir/T1.c.o
    CMakeFiles/CProject.dir/T2.c.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

2绿店、基本數(shù)據(jù)類型占位
C語言中不能直接打印,需要使用占位庐橙。

int main() {
    int i = 10;
    double d = 10;
    float f = 10;
    long l = 10;
    short s = 10;
    char c = '1';
    
    // 字符串 用 char * 表示
    char *str = "字符串";
    
    // printf(i); // 直接寫的話假勿,是不會打印的。
    
    // 需要通過占位态鳖。
    // int long short 可以直接通過 %d 占位
    printf("打印的是int %d\n", i);
    printf("打印的是long %d\n", l);
    printf("打印的是short %d\n", s);

    // double 通過 %lf 占位(相當(dāng)于long float)转培,float 通過 %f 占位
    printf("打印的是double %lf\n", d);
    printf("打印的是float %f\n", f);

    // char 通過 %c 占位
    printf("打印的是char %c\n", c);

    // str 通過 %s 占位
    printf("打印的是string %s\n", str);
}

3、基本數(shù)據(jù)類型占用的字節(jié)數(shù)

int main() {
    // sizeof可以獲取字節(jié)數(shù)
    printf("int占字節(jié)數(shù) %d\n", sizeof(int));
    printf("long占字節(jié)數(shù) %d\n", sizeof(long));
    printf("short占字節(jié)數(shù) %d\n", sizeof(short));
    printf("double占字節(jié)數(shù) %d\n", sizeof(double));
    printf("float占字節(jié)數(shù) %d\n", sizeof(float));

    printf("char占字節(jié)數(shù) %d\n", sizeof(char));

    //int占字節(jié)數(shù) 4
    //long占字節(jié)數(shù) 8
    //short占字節(jié)數(shù) 2
    //double占字節(jié)數(shù) 8
    //float占字節(jié)數(shù) 4
    //char占字節(jié)數(shù) 1
    return NULL;
}

4郁惜、在 C堡距、C++ 語言中甲锡,萬物皆指針( 指針 = 地址 )

int main() {
    // 萬物皆地址
    int i = 1000;
    // 地址用占位符 %p 占位。 在對象前面加 & 表示羽戒,取出對象的內(nèi)存地址
    printf("打印int 1000的地址 %p\n", &i); // 結(jié)果:打印int 1000的內(nèi)存地址 0x7ff7bb35f43c缤沦,每次打印的地址不一樣,由c/c++分配
    int num_int = 1000;
    double num_double = 2000;
    printf("直接獲取值 num_int=%d\n", num_int);
    printf("直接獲取值 num_double=%lf\n", num_double);

    // &num_int 取出num_int的內(nèi)存地址易稠,
    // 在內(nèi)存地址前面加*缸废,代表取出內(nèi)存地址上對應(yīng)的值
    // *&num_int 取出&num_int這個內(nèi)存地址上對應(yīng)的值
    printf("通過地址獲取值 num_int=%d\n", *&num_int);
    printf("通過地址獲取值 num_double=%lf\n", *&num_double);

    // 這里不是定義一個int對象,而是定義一個int *對象(int類型的內(nèi)存地址對象)驶社。
    int *num2_intP = &num_int;
    double *num2_doubleP = &num_double;
    // 在內(nèi)存地址前加*企量,取出值
    printf("num2_int=%d\n", *num2_intP);
    printf("num2_double=%lf\n", *num2_doubleP);

    // 內(nèi)存地址變量、內(nèi)存地址別名亡电、指針届巩、指針變量、指針別名...分別指啥份乒?
    // 以 int *num2_intP = &num_int; 為例恕汇,
    // 內(nèi)存地址 == 指針,int *
    // 指針別名 == 指針變量(指針的變量)或辖,num2_intP
}

5瘾英、通過指針去修改值

int main() {
    int i = 100;
    // 1、直接修改
    i = 200;
    printf("i的是值是%d\n", i);

    // 2颂暇、通過指針修改
    int *ip = &i; // ip就是i的內(nèi)存地址
    *ip = 300; // 取出i內(nèi)存地址上的值缺谴,然后把300賦值給它。
    printf("i的是值是%d\n", i);
}

6耳鸯、函數(shù)聲明的位置

// 2湿蛔、必須定義在main方法之前
void change2(int i) {

}

// 3-1、如果還想定義在main方法之后片拍,那必須在main方法之前聲明煌集,然后在后面實現(xiàn)
void change3(int i);

int main() {
    int i = 1000;

//    change(i);
    change2(i);
    change3(i);
}

// 1妓肢、會報錯捌省,不能在main方法后面聲明。
//void change(int i){
//
//}

// 3-2:在后面實現(xiàn)
void change3(int i) {
}

7碉钠、函數(shù)變量的傳遞

void change(int i) {
    printf("change 改變前纲缓,i的值是 %d,i的地址是%p\n", i, &i);
    i = 2000;
    printf("change 改變后,i的值是 %d,i的地址是%p\n", i, &i);
}

int main() {
    int i = 1000;
    printf("main 調(diào)用change前喊废,i的值是%d,i的地址是%p\n", i, &i);
    change(i);
    printf("main 調(diào)用change后祝高,i的值是%d,i的地址是%p\n", i, &i);
}

打印結(jié)果:

main 調(diào)用change前,i的值是1000,i的地址是0x7ff7b7d6b43c
change 改變前污筷,i的值是 1000,i的地址是0x7ff7b7d6b41c
change 改變后工闺,i的值是 2000,i的地址是0x7ff7b7d6b41c
main 調(diào)用change后,i的值是1000,i的地址是0x7ff7b7d6b43c

可以看到,main方法中的i和change方法中的i的地址是不一樣的陆蟆。
這說明在調(diào)用change方法后雷厂,c編輯器相當(dāng)于是復(fù)制了一份i,這也就解釋了在change方法中改變了i的值叠殷,并不會影響main方法中的i值.

那我們要怎么實現(xiàn)改變同一個變量的值呢改鲫?

聲明不允許函數(shù)重載,所以改個函數(shù)名
void change2(int *pInt) {
    printf("change2 改變前林束,i的值是 %d,i的地址是%p\n", *pInt, pInt);
    // 改變內(nèi)存地址上的值像棘。
    *pInt = 2000;
    printf("change2 改變后,i的值是 %d,i的地址是%p\n", *pInt, pInt);
}

int main() {
    int i = 1000;
    printf("main 調(diào)用change2前壶冒,i的值是%d,i的地址是%p\n", i, &i);
    // 傳遞i的內(nèi)存地址
    change2(&i);
    printf("main 調(diào)用change2后缕题,i的值是%d,i的地址是%p\n", i, &i);
}

打印結(jié)果:

main 調(diào)用change2前,i的值是1000,i的地址是0x7ff7b84a143c
change2 改變前胖腾,i的值是 1000,i的地址是0x7ff7b84a143c
change2 改變后避除,i的值是 2000,i的地址是0x7ff7b84a143c
main 調(diào)用change2后,i的值是2000,i的地址是0x7ff7b84a143c

可以看到胸嘁,main方法中的i和change方法中的i的地址是一樣的了瓶摆。
在change2方法中,改變了同一地址的值后性宏,main方法中的i值也隨之改變群井。

兩個值得互換

void change3(int *ip, int *jp);

// 兩個值互換
int main() {
    int i = 10;
    int j = 20;
    // 傳入i和j的內(nèi)存地址
    change3(&i, &j);
}

void change3(int *ip, int *jp) {
    printf("change3前,i的值%d%毫胜,j的值%d书斜,i的地址%p,j的地址%p\n", *ip, *jp, ip, jp);
    int tempI = *ip; // 定義一個臨時的變量酵使,用來記錄i的值荐吉。
    *ip = *jp; // 將ip地址上的值修改成jp地址上的值。
    *jp = tempI; // 將jp地址上的值修改成ip地址上之前的值口渔。
    printf("change3后样屠,i的值%d,j的值%d缺脉,i的地址%p痪欲,j的地址%p\n", *ip, *jp, ip, jp);
}

打印結(jié)果:

change3前,i的值10攻礼,j的值20业踢,i的地址0x7ff7b2e2a43c,j的地址0x7ff7b2e2a438
change3后礁扮,i的值20知举,j的值10瞬沦,i的地址0x7ff7b2e2a43c,j的地址0x7ff7b2e2a438

可以看到i和j的地址都沒有改變雇锡,值實現(xiàn)了互換蛙埂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遮糖,隨后出現(xiàn)的幾起案子绣的,更是在濱河造成了極大的恐慌,老刑警劉巖欲账,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屡江,死亡現(xiàn)場離奇詭異,居然都是意外死亡赛不,警方通過查閱死者的電腦和手機(jī)惩嘉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踢故,“玉大人文黎,你說我怎么就攤上這事〉罱希” “怎么了耸峭?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淋纲。 經(jīng)常有香客問我劳闹,道長,這世上最難降的妖魔是什么洽瞬? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任本涕,我火速辦了婚禮,結(jié)果婚禮上伙窃,老公的妹妹穿的比我還像新娘菩颖。我一直安慰自己,他們只是感情好为障,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布晦闰。 她就那樣靜靜地躺著,像睡著了一般产场。 火紅的嫁衣襯著肌膚如雪鹅髓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天京景,我揣著相機(jī)與錄音,去河邊找鬼骗奖。 笑死确徙,一個胖子當(dāng)著我的面吹牛醒串,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鄙皇,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芜赌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伴逸?” 一聲冷哼從身側(cè)響起缠沈,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎错蝴,沒想到半個月后洲愤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顷锰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年柬赐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官紫。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肛宋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出束世,到底是詐尸還是另有隱情酝陈,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布毁涉,位于F島的核電站后添,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏薪丁。R本人自食惡果不足惜遇西,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望严嗜。 院中可真熱鬧粱檀,春花似錦、人聲如沸漫玄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睦优。三九已至渗常,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汗盘,已是汗流浹背皱碘。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隐孽,地道東北人癌椿。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓健蕊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踢俄。 傳聞我的和親對象是個殘疾皇子缩功,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容