重学C语言_数据结构与基础语法
c語言標(biāo)準(zhǔn)
2011年12月8日,國際標(biāo)準(zhǔn)化組織(ISO)和國際電工委員會(IEC) 旗下的C語言標(biāo)準(zhǔn)委員會(ISO/IEC JTC1/SC22/WG14)正式發(fā)布了C11標(biāo)準(zhǔn)。
C11標(biāo)準(zhǔn)是C語言標(biāo)準(zhǔn)的第三版,前一個標(biāo)準(zhǔn)版本是C99標(biāo)準(zhǔn)。
目前程序設(shè)計(jì)學(xué)習(xí)使用最多的標(biāo)準(zhǔn)是C99,它是1999年發(fā)布的。
環(huán)境安裝
要想運(yùn)行C語言程序,電腦里面必須得有GCC,也就是C語言的編譯器。
- 驗(yàn)證有沒有g(shù)cc
- cmd里面敲gcc -v
Windows 上的安裝
為了在 Windows 上安裝 GCC,您需要安裝 MinGW。為了安裝 MinGW,請?jiān)L問 MinGW 的主頁 www.mingw.org,進(jìn)入 MinGW 下載頁面,下載最新版本的 MinGW 安裝程序,命名格式為 MinGW-.exe。
點(diǎn)擊download
點(diǎn)擊logo
當(dāng)然,你也可以使用IDE里面自帶的編譯器,一般codeblocks等編輯器都自帶MinGW。
Hello world!
#include <stdio.h> int main() {/* 我的第一個 C 程序 文件名 hello.c */printf("Hello, World! \n");return 0; }編譯運(yùn)行這一段代碼。
gcc hello.c它會自動生成一個a.exe文件 (LINUX平臺為 a.out)
通過 ./a.exe 就可以執(zhí)行。
注釋
// 單行注釋 /** 多行注釋*/標(biāo)識符
用來標(biāo)識變量、函數(shù)。
- 由字母、數(shù)字、下劃線組成
- 數(shù)字不能打頭陣
- 不能出現(xiàn)特殊符號($、@ 不能出現(xiàn))
- 區(qū)分大小寫
C數(shù)據(jù)類型
整數(shù)類型
char、int、short、long、long long都是整數(shù)類型
他們都可以有unsigned的前綴。(unsigned 無符號)
char 的值范圍 -128到127 (-128的二進(jìn)制 10000000)
unsigned char 的值范圍是 0 到 255
浮點(diǎn)數(shù)類型
double 和 float
定義常量
在 C 中,有兩種簡單的定義常量的方式:
C語言修飾符
auto
所有局部變量的默認(rèn)值
{int variable;等價(jià)于auto int variable; }static
可以修飾局部變量 和 全局變量。
c 語言中,把變量定義在 大括號外面就是全局變量。
static int count = 10; 等價(jià)于 int count = 10;void main(){// do something }extern
extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當(dāng)您使用 extern 時,對于無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
詳細(xì)見菜鳥教程
c - if 判斷
定義:C 語言把任何非零和非空的值假定為 true,把零或 null 假定為 false。
C - 循環(huán)
-
有while,for,do while循環(huán)
-
break 結(jié)束循環(huán)
-
continue 停止本次循環(huán),執(zhí)行下一步
C - 函數(shù)
語法:
return_type function_name( parameter list ) {body of the function }- **返回類型:**一個函數(shù)可以返回一個值。return_type 是函數(shù)返回的值的數(shù)據(jù)類型。有些函數(shù)執(zhí)行所需的操作而不返回值,在這種情況下,return_type 是關(guān)鍵字 void。
- **函數(shù)名稱:**這是函數(shù)的實(shí)際名稱。函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名。
- **參數(shù):**參數(shù)就像是占位符。當(dāng)函數(shù)被調(diào)用時,您向參數(shù)傳遞一個值,這個值被稱為實(shí)際參數(shù)。參數(shù)列表包括函數(shù)參數(shù)的類型、順序、數(shù)量。參數(shù)是可選的,也就是說,函數(shù)可能不包含參數(shù)。
- **函數(shù)主體:**函數(shù)主體包含一組定義函數(shù)執(zhí)行任務(wù)的語句。
函數(shù)參數(shù)
如果函數(shù)要使用參數(shù),則必須聲明接受參數(shù)值的變量。這些變量稱為函數(shù)的形式參數(shù)。
形式參數(shù)就像函數(shù)內(nèi)的其他局部變量,在進(jìn)入函數(shù)時被創(chuàng)建,退出函數(shù)時被銷毀。
函數(shù)參數(shù):
- 傳值 (不會修改原來的值)
- 傳地址
函數(shù)聲明:
- 如果調(diào)用外部函數(shù),必須得提前聲明
- 如果main在調(diào)用的函數(shù)前面,必須得提前聲明
函數(shù)的形參名不重要,所以函數(shù)聲明時可以忽略。
#include <stdio.h> #include <stdlib.h> int sum(int,int); // int sum(int a,int b); // 這兩種都可以int main() {int x=3,y=5;printf("%d",sum(x,y));return 0; }int sum(int a,int b){return a+b; }當(dāng)形參和全局變量同名的時候,形參的值在函數(shù)體內(nèi)部會覆蓋掉全局變量。
傳遞數(shù)組給函數(shù)作為參數(shù)
方式 1
形式參數(shù)是一個指針:
void myFunction(int *param) { . . . }
方式 2
形式參數(shù)是一個已定義大小的數(shù)組:
void myFunction(int param[10]) { . . . }
方式 3
形式參數(shù)是一個未定義大小的數(shù)組:
void myFunction(int param[]) { . . . }
建議采用方式1或者3
數(shù)組作為函數(shù)的返回值
C 語言不允許返回一個完整的數(shù)組作為函數(shù)的參數(shù)。
但是,您可以通過指定不帶索引的數(shù)組名來返回一個指向數(shù)組的指針。
// int[] getArr() //這種語法是錯誤的int * getArr( ) {static int r[10] = {1,2,3};; // 必須使用static來修飾,否則報(bào)錯return r; }初始化局部變量和全局變量
當(dāng)局部變量被定義時,系統(tǒng)不會對其初始化,您必須自行對其初始化。定義全局變量時,系統(tǒng)會自動對其初始化,如下所示:
| int | 0 |
| char | ‘\0’ |
| float | 0 |
| double | 0 |
| pointer | NULL |
正確地初始化變量是一個良好的編程習(xí)慣,否則有時候程序可能會產(chǎn)生意想不到的結(jié)果,因?yàn)槲闯跏蓟淖兞繒?dǎo)致一些在內(nèi)存位置中已經(jīng)可用的垃圾值。
作用域
- 全局變量
- 局部變量
- 形式參數(shù)
c語言中是塊級作用域,即變量只服務(wù)于大括號內(nèi)部。
{int a; // 外面訪問不到這個 }函數(shù)體定義的形參等價(jià)于函數(shù)體內(nèi)部定義的局部變量。
void func(int x){// 等價(jià)于函數(shù)體里面寫 int x; }當(dāng)局部變量和全局變量重名的時候,優(yōu)先獲取的是局部變量的值。
C - 數(shù)組
定義: 數(shù)組是用來存儲一系列數(shù)據(jù),它是一系列相同類型的變量。
語法:type arrayName [ arraySize ];
初始化數(shù)組
在 C 中,您可以逐個初始化數(shù)組,也可以使用一個初始化語句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};大括號 { } 之間的值的數(shù)目不能大于我們在數(shù)組聲明時在方括號 [ ] 中指定的元素?cái)?shù)目。
如果您省略掉了數(shù)組的大小,數(shù)組的大小則為初始化時元素的個數(shù)。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};如果您只賦值,其中一部分,那么剩余的值將采用默認(rèn)值。
int arr[5] = {1,2,3}; // [1,2,3,0,0] int的默認(rèn)值是0獲取數(shù)組的Length
int arr[5] = {1,2,3}; int len = sizeof(arr) / sizeof(arr[0]); // 5使用size運(yùn)算符通過計(jì)算就可以獲得數(shù)組的長度,但是這還是很不方便。
可以進(jìn)一步使用宏定義。
#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));} int main (){int arr[5] = {1,2,3};int len;GET_ARRAY_LEN(arr,len); // 此時len = 5 }千萬不要把sizeof(arr) / sizeof(arr[0])封裝到函數(shù)里面,你獲取的長度將永遠(yuǎn)是1。
深坑,請勿踩雷!~
二維數(shù)組
多維數(shù)組最簡單的形式是二維數(shù)組。一個二維數(shù)組,在本質(zhì)上,是一個一維數(shù)組的列表。聲明一個 x 行 y 列的二維整型數(shù)組,形式如下:
type arrayName [ x ][ y ];其中,type 可以是任意有效的 C 數(shù)據(jù)類型,arrayName 是一個有效的 C 標(biāo)識符。一個二維數(shù)組可以被認(rèn)為是一個帶有 x 行和 y 列的表格。下面是一個二維數(shù)組,包含 3 行和 4 列:
int x[3][4];因此,數(shù)組中的每個元素是使用形式為 a[ i , j ] 的元素名稱來標(biāo)識的,其中 a 是數(shù)組名稱,i 和 j 是唯一標(biāo)識 a 中每個元素的下標(biāo)。
初始化二維數(shù)組
多維數(shù)組可以通過在括號內(nèi)為每行指定值來進(jìn)行初始化。下面是一個帶有 3 行 4 列的數(shù)組。
int a[3][4] = { {0, 1, 2, 3} , /* 初始化索引號為 0 的行 */{4, 5, 6, 7} , /* 初始化索引號為 1 的行 */{8, 9, 10, 11} /* 初始化索引號為 2 的行 */ };內(nèi)部嵌套的括號是可選的,下面的初始化與上面是等同的:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};訪問二維數(shù)組元素
二維數(shù)組中的元素是通過使用下標(biāo)(即數(shù)組的行索引和列索引)來訪問的。例如:
int val = a[2][3];C - 枚舉
語法:enum 枚舉名 {枚舉元素1,枚舉元素2,……};
enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN };這樣看起來是不是更簡潔了。
**注意:**第一個枚舉成員的默認(rèn)值為整型的 0,后續(xù)枚舉成員的值在前一個成員上加 1。我們在這個實(shí)例中把第一個枚舉成員的值定義為 1,第二個就為 2,以此類推。
可以在定義枚舉類型時改變枚舉元素的值:
enum season {spring, summer=3, autumn, winter};沒有指定值的枚舉元素,其值為前一元素加 1。也就說 spring 的值為 0,summer 的值為 3,autumn 的值為 4,winter 的值為 5
枚舉變量的定義 - 實(shí)例化
前面我們只是聲明了枚舉類型,接下來我們看看如何定義枚舉變量。
我們可以通過以下三種方式來定義枚舉變量
1、先定義枚舉類型,再定義枚舉變量
enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum DAY day;2、定義枚舉類型的同時定義枚舉變量
enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN } day;3、省略枚舉名稱,直接定義枚舉變量
enum {MON=1, TUE, WED, THU, FRI, SAT, SUN } day;C - 指針
定義:指針是一個變量,其值為另一個變量的地址。
語法: type * variable
備注:這個*是聲明指針運(yùn)算符,不是乘號,更不是對地址取值
#include <stdio.h>int main () {int var = 20; /* 實(shí)際變量的聲明 */int *ip; /* 指針變量的聲明 */ip = &var; /* 在指針變量中存儲 var 的地址 */printf("var 變量的地址: %p\n", &var );/* 在指針變量中存儲的地址 */printf("ip 變量存儲的地址: %p\n", ip );/* 使用指針訪問值 */printf("*ip 變量的值: %d\n", *ip );return 0; }空指針
在變量聲明的時候,如果沒有確切的地址可以賦值,為指針變量賦一個 NULL 值是一個良好的編程習(xí)慣。
#define NULL 0 // NULL 指針是一個定義在標(biāo)準(zhǔn)庫中的值為零的常量。實(shí)例:
#include <stdio.h> int main () { int *ptr = NULL; printf("ptr 的地址是 %p\n", ptr ); return 0; }當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:
ptr 的地址是 0x0取值和取地址運(yùn)算符
// * 取值運(yùn)算符 // & 取地址運(yùn)算符int main() {int a = 1;int *p;p = &a;printf("%d",*p); // 1return 0; }總結(jié)
以上是生活随笔為你收集整理的重学C语言_数据结构与基础语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年_Jsp Jstl 学习笔记
- 下一篇: yarn使用指南