tft每日頭條

 > 生活

 > c語言的基礎知識大全

c語言的基礎知識大全

生活 更新时间:2024-10-14 16:33:37

一、函數

  • 什麼情況下需要定義一個函數
  • 常用的功能
  • 重用的功能
  • 低效率的代碼
  • 一個函數可以沒有參數

void test(void){ //void可以不寫 //函數體中不用寫返回函數(return) }

  • 一個函數可以沒有返回值,如果沒有定義,默認是返回int類型

test(int a, int b){ //返回值類型可以不寫,如果不寫,默認為返回int類型 }

  • 在沒有接觸指針前,函數中的形參是修改不了實參的值的
  • 函數從源文件自上往下執行編譯,所以在調用函數之前,需要聲明函數
  • 函數内部定義不能和形參同名的變量
  • 默認情況下,不允許兩個同名的函數出現
  • 如果函數有聲明,沒有定義,編譯不會報錯,鍊接會報錯,因為鍊接會檢測函數是否存在
  • return函數的作用
  • 退出函數
  • 返回一個具體值給函數調用者
  • 函數不強制要求返回,雖然聲明了返回值類型,也無濟于事
  • 什麼叫做鍊接?
  • 把項目中所有相關聯的”.o”文件和C語言函數庫,合并在一起,生成可執行文件,期間會檢查可能發生的錯誤,如果出現錯誤,就會回到編寫代碼的步驟,修改相應錯誤代碼後,再執行流程
  • 函數的定義和聲明
  • 函數的定義放在”.c”文件中
  • 函數的聲明放在”.h”文件中
  • main函數返回值0代表正常退出,返回其他值代表異常退出,系統會記錄日志
  • printf()函數其實也有返回值,它返回字符串的字節數,在當前的編譯器中,中文占3個字節二、指針
  • 定義和初始化指針

int a = 10; //定義了一個int類型的變量 int *pa = NULL; //定義了一個int類型的指針 pa = &a; //将int類型變量a的地址賦值給pa指針,或者說pa指針指向了變量a *pa = 20; //通過指針簡介修改變量a的值,*稱為取消引用運算符或間接運算符

c語言的基礎知識大全(你還有哪塊知識不懂嗎)1

二、指針

  • 指針隻能指向相同類型的變量并且指針隻能存儲地址
  • 任何指針都占用8個字節的存儲空間,當然也受編譯器的影響
  • 通過指針就可以利用形參修改實參的值,因為指針指向的是地址
  • 指針字符串

//使用char數組存儲字符串,這個叫做字符串變量 char str1[] = “luoguankun”; //使用指針存儲字符串,它指向字符串的首字母 //這個稱為字符串常量,如果再聲明一個字符串值一樣的指針字符串 //那麼他們會指向同一 個字符串,而不會創建一個新的 char *str2 = “luoguankun”;

  • %s
  • 上面的輸出語句中的%s是字符串輸出控制格式符
  • 它從第一個字符開始直到遇到’\0’終止符号結束(不包括)
  • 内存
  • 棧——就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區。裡面的變量通常是局部變量、函數參數等
  • 堆——就是那些由new分配的内存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收
  • 自由存儲區——就是那些由malloc等分配的内存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的
  • 全局/靜态存儲區——全局變量和靜态變量被分配到同一塊内存中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C 裡面沒有這個區分了,他們共同占用同一塊内存區
  • 常量存儲區——這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
  • \0
  • 隻有擁有’\0’終止符,才說明這是一個字符串,字符是沒有的
  • \0 的ASCII碼值為0,也就是false
  • 指針數組
  • 數組就是地址

int *name[5]; name[1] //取出元素下标為1的元素(指針)

  • 字符串數組(兩種方式定義)
  • char *name[10] //10個字符串
  • char name[2][10] //二維字符數組,可存放2行字符串,每行有10個字符
  • 指向指針的函數

//定義了一個加法函數 int sum(int a, int b){ return a b; } //将定義好的指針指向函數 //首先聲明一個指針 int (*p)(int,int); //其中(*p)代表将來指向的函數,(*p)左右分别為返回值類型和形參定義 p = sum; //将指針p指向test函數 p(10,22); //通過指針調用函數,它等于sum(10,22);當然在調用之前别忘了聲明函數

  • 可以使用sizeof()運算符計算字符串長度(計算的是字節數)
  • sizeof()的結果類型是size_t類型,它在頭文件中用typedef定義為unsigned int類型
  • sizeof()運算符可以用任何類型做參數,甚至函數
  • 也可以使用strlen()函數計算字符串長度
  • strlen()隻能用char*做參數,且必須是以’’\0’'結尾的
  • 要想使用需要引入<string.h>頭文件
  • 變量類型
  • 全局變量
  • 定義:在函數外面定義的變量叫做全局變量
  • 作用域:從定義變量的那一行開始,到文件結尾
  • 生命周期:當程序啟動開始分配存儲空間,到程序退出才會被銷毀
  • 初始值如果未定義就為0
  • 局部變量
  • 定義:在函數代碼塊内部定義的變量
  • 作用域:從定義變量的那一行開始到代碼塊結束
  • 生命周期:從定義變量開始分配存儲空間,代碼塊結束後就會被回收
  • 初始沒有确定的值

初學者有什麼不懂的可以私信我,需要系統學習資料和系統學習框架圖的同學,可關注小編頭條号,歡迎留言評論和私信小編。【私信方法】文章上方處點擊“作者頭像”,進入作者首頁,在作者主頁上方點擊“關注”旁邊的“發私信”即可。私信内容:學習幫助。

c語言的基礎知識大全(你還有哪塊知識不懂嗎)2

三、結構體

數組隻能存儲一組同類型的數據,而結構體可以保存一組不同類型的數據

  • 定義結構體類型

//以下定義沒有分配存儲空間,僅僅定義類型

struct Person { int age; int sex; char *name; };

  • 定義結構體變量

struct Person p;

  • 賦值

p.age = 13; //一種方式 //另一種方式,初始化的同時進行賦值,同時進行分配存儲空間 //結構體的存儲空間是最大成員字節數的倍數,稱為補齊算法 struct Person p = {13,1,”luoguankun”}; p = {13,1,”luoguankun”}; //這是錯誤的!隻能在定義結構體時賦值

  • 輸出結構體中定義的變量值

printf(“age=%d,sex=%d,name=%s”,p.age,p.sex,p.name);

  • 另一種定義結構體變量的方式

//定義類型的同時定義變量,甚至可以不寫類型名稱,稱為匿名結構體,它不能被重用 //并且變量名不能重複 struct Student{ int age; }stu;

  • 類型不能重複定義,例如上面的Student不能被定義兩次,變量名也一樣不能重複
  • 結構體數組

//定義結構體類型 struct Person{ int age; double height; char *name; }stu; //定義結構體數組變量并賦值初始化 struct Person stu[3] = { {11,12.1,"o"}, {12,12.2,"u"}, {13,12.3,”l"} }; //循環遍曆結構體數組,并打印 for (int i = 0; i < sizeof(stu) / sizeof(stu[0]); i ) { printf("age=%d,height=%.1f,name=%s\n",stu[i].age,stu[i].height,stu[i].name); } //stu[i] = {4,1.22,”dkdk”}; //這是錯誤的 stu[i].age = 4; //這樣是正确的

  • 指向結構體的指針

//省略類型定義,如上,下面使用結構體變量并賦值初始化 struct Person stu = {11, 1.73, "羅冠坤"}; //定義了一個指針p并指向結構體變量stu struct Person *p = &stu; //三種輸出方法都可以輸出數據,作用相同,其中p->成員名的方式較為新穎 printf("age=%d,height=%.2f,name=%s\n",stu.age,stu.height,stu.name); printf("age=%d,height=%.2f,name=%s\n",(*p).age,(*p).height,(*p).name); printf(“age=%d,height=%.2f,name=%s\n",p->age,p->height,p->name); //賦值方法的調用方法相同

  • 嵌套結構體

int main(){ struct Date{ int year; //年 int month; //月 int day; //日 }; struct Student{ int no; //學号 //嵌套兩個Date來分别表示生日和入學日期 struct Date birthday; //生日 struct Date SchoolDay; //入學日期 }; struct Student stu = { 1, {1989,10,24}, {2009, 9, 1} }; //間接取值,嵌套訪問 printf("學号為:%d\n生日為:%d年%d月%d日\n入學日期為:%d年%d月%d日\n", stu.no,stu.birthday.year,stu.birthday.month,stu.birthday.day, stu.SchoolDay.year,stu.SchoolDay.month,stu.SchoolDay.day); return 0;

希望小編文章的朋友可以關注、收藏、轉發、留言,,也可以私信我(學習幫助),我将給你提高學習上的幫助,最後祝大家閱讀愉快!!

c語言的基礎知識大全(你還有哪塊知識不懂嗎)3

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved