前言
在Android音視頻開發中,網上知識點過于零碎,自學起來難度非常大,不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》,結合我自己的工作學習經歷,我準備寫一個音視頻系列blog。C/C++是音視頻必備編程語言,我準備用幾篇文章來快速回顧C語言。本文是音視頻系列blog的其中一個, 對應的要學習的內容是:快速回顧C語言的變量和賦值,printf函數和scanf函數,判斷語句,循環語句,基本數據類型,數組,函數。
音視頻系列blog
音視頻系列blog: 點擊此處跳轉查看.
目錄
1 C語言第一個程序
第一個程序肯定是輸出“Hello World”,程序中永恒的經典!!!
在C語言中,要輸出 “Hello World”,可以使用標準庫函數 printf
。以下是一個簡單的示例代碼:
#include <stdio.h>int main() {printf("Hello World\n");return 0;
}
運行之后,可以看到輸出的 “Hello World”。
2 變量和賦值
2.1 變量
在C語言中,變量是一種用于存儲數據值的命名位置。每個變量都有一個特定的數據類型,如整數、字符、浮點數等,以確定變量可以存儲的數據類型和所占用的內存大小。變量在程序中用于存儲、操作和處理數據。
以下是關于C語言變量的一些重要信息:
- 變量聲明: 在使用變量之前,需要聲明變量的名稱和數據類型。變量聲明的一般格式是:
數據類型 變量名;
,例如:int age;
表示聲明了一個名為"age"的整數型變量。 - 變量賦值: 在聲明變量后,可以通過賦值操作將值存儲到變量中。例如:
age = 25;
表示將整數值25存儲在變量"age"中。 - 變量初始化: 變量聲明的同時也可以進行初始化,即在聲明變量時賦予初始值。例如:
int score = 100;
表示聲明一個名為"score"的整數型變量,并將初始值設為100。 - 變量命名規則: C語言變量的命名必須遵循一定的規則,如變量名只能由字母、數字和下劃線組成,不能以數字開頭,區分大小寫等。
- 數據類型: C語言提供了多種數據類型,包括基本數據類型(如整數、浮點數、字符)以及派生數據類型(如數組、結構體、指針)。不同數據類型具有不同的取值范圍和所占內存大小。
- 作用域: 變量的作用域指的是變量在程序中可見的范圍。C語言中有局部變量和全局變量兩種,局部變量只在特定代碼塊內可見,而全局變量在整個程序中都可見。
- const關鍵字: 使用
const
關鍵字可以聲明一個常量,即一個不可更改的變量。常量的值在程序運行過程中不能被修改。 - sizeof運算符:
sizeof
運算符用于獲取變量或數據類型所占用的字節數。例如:int size = sizeof(int);
表示獲取整數類型所占的字節數并存儲在變量"size"中。
以下是一些示例:
#include <stdio.h>int main() {int age; // 聲明一個整數型變量age = 25; // 賦值操作int score = 100; // 聲明并初始化一個整數型變量const double pi = 3.14159; // 聲明一個常量printf("Age: %d\n", age);printf("Score: %d\n", score);printf("Pi: %f\n", pi);return 0;
}
以上代碼演示了變量的聲明、賦值、初始化以及常量的使用。
2.2 賦值
在C語言中,賦值是將一個值存儲到變量中的過程。賦值操作使用賦值運算符(=
)來完成。賦值運算符將右側的值賦給左側的變量。
以下是賦值操作的基本語法:
variable = expression;
其中,variable
是要接收賦值的變量,而 expression
是要賦給變量的值或表達式。
例如:
int x; // 聲明一個整數型變量
x = 10; // 將值10賦給變量xdouble pi = 3.14159; // 聲明并初始化一個雙精度浮點型變量
你還可以在賦值操作中使用表達式,如:
int a = 5;
int b = 3;
int c = a + b; // 將a加b的結果賦給變量c
需要注意的是,賦值運算是從右向左進行的。即右邊的表達式會被計算,然后將計算結果賦給左邊的變量。
此外,C語言還支持復合賦值運算符,這些運算符將運算符與賦值操作結合起來,以簡化代碼。例如:
int num = 10;
num += 5; // 等同于 num = num + 5;
num *= 2; // 等同于 num = num * 2;
這些復合賦值運算符可以將操作和賦值合并到一個語句中。
賦值是C語言中重要的操作之一,允許你將值存儲在變量中,以便在程序中進行操作和處理。
3 printf函數和scanf函數
3.1 printf函數
printf
是C語言中用于輸出信息到標準輸出(通常是終端或命令行窗口)的函數。它是C標準庫中的一個函數,用于在屏幕上顯示文本或變量的值。
以下是 printf
函數的基本語法:
#include <stdio.h> // 包含頭文件以使用printf函數int main() {printf("Hello, world!\n"); // 輸出字符串并換行return 0;
}
在上述示例中,printf
函數輸出了字符串 "Hello, world!"
,并且使用 \n
進行換行。
printf
函數中可以使用格式控制符來指定輸出的格式。一些常見的格式控制符包括:
%d
:用于輸出整數。%f
:用于輸出浮點數。%c
:用于輸出字符。%s
:用于輸出字符串。%x
:用于輸出十六進制整數。
以下是一個使用格式控制符的示例:
#include <stdio.h>int main() {int age = 25;float height = 175.5;char grade = 'A';char name[] = "John";printf("Age: %d\n", age);printf("Height: %.2f\n", height); // 輸出浮點數并控制小數點后的位數printf("Grade: %c\n", grade);printf("Name: %s\n", name);return 0;
}
在這個示例中,%d
、%.2f
、%c
和 %s
是格式控制符,它們會被 printf
函數替換為相應的變量的值。
注意,格式控制符可以帶有附加信息,如 .2
在 %f
后面表示要輸出的浮點數保留兩位小數。
printf
函數是C語言中用于輸出內容的重要工具,可以幫助你在屏幕上顯示文本、變量值以及格式化信息。
3.2 scanf函數
scanf
是C語言中用于從標準輸入(通常是鍵盤)獲取輸入數據并存儲到變量中的函數。它是C標準庫中的一個函數,用于讀取用戶輸入的數據。
以下是 scanf
函數的基本語法:
#include <stdio.h> // 包含頭文件以使用scanf函數int main() {int num;printf("Enter a number: ");scanf("%d", &num); // 從用戶輸入讀取整數,并將值存儲到num變量中printf("You entered: %d\n", num);return 0;
}
在上述示例中,scanf
函數等待用戶輸入一個整數,并使用 %d
格式控制符將輸入的值存儲到變量 num
中。需要注意的是,scanf
函數的參數中變量前面需要加上 &
符號,表示取該變量的地址。
如果你想獲取多個輸入,可以在 scanf
函數中使用多個格式控制符,如:
#include <stdio.h>int main() {int age;float height;printf("Enter your age: ");scanf("%d", &age);printf("Enter your height (in cm): ");scanf("%f", &height);printf("Age: %d, Height: %.2f\n", age, height);return 0;
}
在輸入多個值時,需要確保輸入的數據類型與格式控制符相匹配,否則可能會導致錯誤或意外行為。
需要注意的是,scanf
函數對輸入數據的處理可能會有一些限制和安全性問題,例如,它對錯誤的輸入處理不佳。在實際應用中,可能需要添加額外的輸入驗證來確保輸入的數據有效和合理。
scanf
函數是C語言中用于獲取用戶輸入的函數,可以幫助你從標準輸入讀取數據并存儲到變量中。
4 if else語句和switch語句
4.1 if else語句
if
和 else
是C語言中用于控制程序流程的條件語句。它們允許你根據條件的真假來執行不同的代碼塊。
以下是 if
和 else
語句的基本語法:
if (condition) {// 如果條件為真,執行這里的代碼塊
} else {// 如果條件為假,執行這里的代碼塊
}
在上述語法中,condition
是一個表達式,它的值會被判斷為真(非零)或假(零)。如果 condition
為真,那么 if
代碼塊中的代碼將被執行。如果 condition
為假,那么 else
代碼塊中的代碼將被執行。
以下是一個簡單的例子:
#include <stdio.h>int main() {int num = 10;if (num > 0) {printf("The number is positive.\n");} else {printf("The number is non-positive.\n");}return 0;
}
在這個例子中,如果變量 num
的值大于0,那么會輸出 “The number is positive.”,否則會輸出 “The number is non-positive.”。
你也可以使用多個 if
和 else if
來構建更復雜的條件判斷結構:
#include <stdio.h>int main() {int score;printf("Enter your score: ");scanf("%d", &score);if (score >= 90) {printf("Grade: A\n");} else if (score >= 80) {printf("Grade: B\n");} else if (score >= 70) {printf("Grade: C\n");} else if (score >= 60) {printf("Grade: D\n");} else {printf("Grade: F\n");}return 0;
}
在這個例子中,根據輸入的分數,程序會輸出對應的等級。
if
和 else
語句是構建條件邏輯的基礎,它們使你可以根據不同的條件執行不同的代碼塊,從而實現更靈活和有針對性的程序行為。
4.2 switch語句
switch
語句是C語言中用于根據不同的條件值執行不同代碼塊的一種選擇結構。它適用于當你有多個固定的選項需要進行選擇時,可以將多個條件分支進行組織,使代碼更清晰、簡潔。
以下是 switch
語句的基本語法:
switch (expression) {case constant1:// 執行代碼塊1break;case constant2:// 執行代碼塊2break;// 更多 case 分支default:// 執行默認代碼塊(可選)
}
在上述語法中,expression
是一個表達式,而 constant1
、constant2
等是常量或常量表達式。switch
語句會根據 expression
的值進行匹配,然后根據匹配到的常量執行對應的代碼塊。如果沒有匹配到任何常量,可以使用 default
分支。
以下是一個簡單的例子:
#include <stdio.h>int main() {char operator;double num1, num2;printf("Enter an operator (+, -, *, /): ");scanf("%c", &operator);printf("Enter two numbers: ");scanf("%lf %lf", &num1, &num2);switch (operator) {case '+':printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);break;case '-':printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);break;case '*':printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);break;case '/':if (num2 != 0) {printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);} else {printf("Cannot divide by zero.\n");}break;default:printf("Invalid operator.\n");}return 0;
}
在這個例子中,根據用戶輸入的操作符,程序使用 switch
語句來選擇不同的操作。
需要注意的是,在每個 case
分支的末尾要使用 break
關鍵字,以防止代碼繼續執行其他分支。如果沒有 break
,程序會繼續執行后續的分支代碼。
5 while語句、do語句和 for語句
5.1 while語句
while
是C語言中用于創建循環的一種迭代語句。它允許你根據條件的真假重復執行一段代碼塊,直到條件不再滿足為止。
以下是 while
循環的基本語法:
while (condition) {// 循環體,如果條件為真則執行
}
在上述語法中,condition
是一個表達式,如果其值為真(非零),則會重復執行循環體中的代碼。當 condition
的值為假(零),循環會終止,程序將繼續執行循環后的代碼。
以下是一個簡單的例子:
#include <stdio.h>int main() {int count = 1;while (count <= 5) {printf("Count: %d\n", count);count++;}return 0;
}
在這個例子中,count
從 1 開始遞增,當 count
小于等于 5 時,循環會一直重復執行輸出 Count
的值,并遞增 count
直到達到 6。需要注意的是,如果 condition
一開始就為假,while
循環的代碼塊可能永遠不會被執行。
你可以使用 while
循環來處理不確定次數的迭代,只要條件滿足,循環會一直運行。為了防止無限循環,確保在循環體內改變循環條件或者使用適當的控制語句來終止循環。
5.2 do語句
當使用 do
…while
語句時,循環體中的代碼會至少被執行一次,然后在循環結束時檢查循環條件。這使得 do
…while
循環在一些特定場景下非常有用,例如需要至少執行一次某個操作,然后根據條件判斷是否繼續執行。
以下是一個示例,展示了如何使用 do
…while
循環來獲取用戶輸入并驗證輸入的有效性:
#include <stdio.h>int main() {int number;do {printf("Enter a positive number: ");scanf("%d", &number);if (number <= 0) {printf("Invalid input. Please enter a positive number.\n");}} while (number <= 0);printf("You entered a positive number: %d\n", number);return 0;
}
在這個例子中,循環體首先要求用戶輸入一個數字,然后檢查該數字是否為正數。如果輸入的數字不是正數,循環會繼續執行,要求用戶重新輸入,直到輸入的數字是正數為止。
需要注意的是,do
…while
循環在判斷循環條件之前至少會執行一次循環體中的代碼。這與其他循環結構(如 while
循環)不同,其他循環結構會在判斷循環條件之前檢查是否要執行循環體。
do
…while
循環在需要至少執行一次循環體的情況下很有用,可以保證在檢查循環條件之前,循環體內的代碼至少會被執行一次。
5.3 for語句
for
是C語言中用于創建循環的一種迭代語句,它提供了一種簡潔的方式來控制循環的初始化、條件和遞增。
以下是 for
循環的基本語法:
for (initialization; condition; increment) {// 循環體
}
在上述語法中,initialization
是循環初始化的表達式,它在循環開始之前被執行一次。condition
是循環的條件表達式,如果條件為真(非零),則循環體會被執行。increment
是循環遞增表達式,它在每次循環迭代結束后被執行。
以下是一個簡單的例子:
#include <stdio.h>int main() {for (int i = 1; i <= 5; i++) {printf("Iteration: %d\n", i);}return 0;
}
在這個例子中,for
循環從 i
初始化為 1 開始,然后在 i
小于等于 5 的條件下重復執行循環體。在每次循環迭代結束后,i
會遞增一次。
你可以根據需要在 initialization
、condition
和 increment
部分編寫相應的表達式,以控制循環的行為。例如,你可以創建從任意起始值到任意結束值的循環,也可以使用負值或浮點數作為循環控制。
以下是一個計算階乘的例子,使用 for
循環:
#include <stdio.h>int main() {int n;int factorial = 1;printf("Enter a positive integer: ");scanf("%d", &n);for (int i = 1; i <= n; i++) {factorial *= i;}printf("Factorial of %d: %d\n", n, factorial);return 0;
}
在這個例子中,for
循環用于計算給定正整數的階乘。循環從 1 到輸入的整數 n
進行迭代,并將每次迭代的值乘到 factorial
中。
for
循環是C語言中用于控制循環的一種強大方式,它提供了初始化、條件和遞增的結構,使得循環邏輯更加緊湊。
6 基本數據類型
C語言中的基本數據類型用于存儲不同種類的數據,如整數、浮點數、字符等。這些基本數據類型可以用于聲明變量、函數參數和返回值等。
以下是C語言中常見的基本數據類型:
- 整數類型:
int
:整數類型,通常占用4個字節(32位)的內存。short
:短整數類型,通常占用2個字節(16位)的內存。long
:長整數類型,占用4個字節或8個字節的內存,具體取決于編譯器和操作系統。long long
:更長的整數類型,通常占用8個字節的內存。
- 無符號整數類型:
unsigned int
:無符號整數類型,存儲非負整數。unsigned short
:無符號短整數類型。unsigned long
:無符號長整數類型。unsigned long long
:無符號更長的整數類型。
- 字符類型:
char
:字符類型,通常占用1個字節的內存,用于存儲ASCII碼中的字符。
- 浮點數類型:
float
:單精度浮點數類型,通常占用4個字節的內存,用于存儲小數。double
:雙精度浮點數類型,通常占用8個字節的內存,提供更高的精度。
- 布爾類型:
bool
(需要包含<stdbool.h>
頭文件):布爾類型,存儲true
或false
值。
C語言的標準庫還定義了一些用于表示內存大小和數據范圍的宏,如 sizeof
運算符用于獲取數據類型的字節數,INT_MAX
和 INT_MIN
分別表示 int
類型的最大和最小值等。
例如,以下代碼演示了如何聲明不同的基本數據類型的變量和使用一些宏:
#include <stdio.h>
#include <limits.h> // 包含一些整數類型的范圍宏int main() {int myInt = 42;char myChar = 'A';float myFloat = 3.14;double myDouble = 2.71828;bool myBool = true;printf("Size of int: %lu bytes\n", sizeof(int));printf("Size of char: %lu bytes\n", sizeof(char));printf("Size of float: %lu bytes\n", sizeof(float));printf("Size of double: %lu bytes\n", sizeof(double));printf("Size of bool: %lu byte\n", sizeof(bool));printf("Maximum value of int: %d\n", INT_MAX);printf("Minimum value of int: %d\n", INT_MIN);return 0;
}
在上述示例中,我們展示了不同數據類型的聲明、sizeof
運算符的使用以及一些整數范圍的宏。
7 數組
7.1 一維數組
在C語言中,一維數組是一種用于存儲相同數據類型元素的線性數據結構。數組允許你在一個變量中存儲多個相同類型的值,并通過索引訪問這些值。數組的索引從0開始,逐漸遞增。
以下是一維數組的基本語法:
data_type array_name[array_size];
在上述語法中,data_type
是數組中元素的數據類型,array_name
是數組的名稱,array_size
是數組的大小,即可以存儲的元素個數。
以下是一個示例,展示如何聲明、初始化和訪問一維數組:
#include <stdio.h>int main() {int numbers[5]; // 聲明一個包含5個整數的數組// 初始化數組numbers[0] = 10;numbers[1] = 20;numbers[2] = 30;numbers[3] = 40;numbers[4] = 50;// 訪問和輸出數組元素printf("Element at index 0: %d\n", numbers[0]);printf("Element at index 1: %d\n", numbers[1]);printf("Element at index 2: %d\n", numbers[2]);printf("Element at index 3: %d\n", numbers[3]);printf("Element at index 4: %d\n", numbers[4]);return 0;
}
在這個示例中,我們聲明了一個名為 numbers
的整數數組,然后初始化數組的各個元素,最后通過索引訪問并輸出了數組中的元素。
你也可以在聲明數組時同時進行初始化:
int numbers[5] = {10, 20, 30, 40, 50};
如果不顯式提供初始化值,數組的元素將會被自動初始化為0(對于數字類型)或者空字符 '\0'
(對于字符類型)。
一維數組在C語言中是非常常用的數據結構,用于存儲列表、序列和集合等數據。數組的索引從0開始,注意在訪問數組元素時,索引不能超出數組的范圍,否則可能導致未定義的行為。
7.2 二維數組
二維數組是C語言中的一種數據結構,用于存儲表格形式的數據,即具有行和列的數據。二維數組實際上是由多個一維數組組成的,每個一維數組代表二維數組的一行。
以下是二維數組的基本語法:
data_type array_name[row_size][column_size];
在上述語法中,data_type
是數組中元素的數據類型,array_name
是數組的名稱,row_size
是數組的行數,column_size
是數組的列數。
以下是一個示例,展示如何聲明、初始化和訪問二維數組:
#include <stdio.h>int main() {int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};// 訪問和輸出二維數組元素for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {printf("%d ", matrix[i][j]);}printf("\n");}return 0;
}
在這個示例中,我們聲明了一個名為 matrix
的3行4列的整數二維數組,然后初始化數組的各個元素,并使用兩層循環來遍歷并輸出整個二維數組。
你也可以在聲明二維數組時省略行數,只指定列數,然后在初始化時根據需要提供行數:
int matrix[][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}
};
二維數組在模擬矩陣、表格等多維數據時非常有用。注意,在訪問二維數組元素時,需要使用兩個索引來指定行和列的位置。同樣要確保索引不超出數組的范圍,以避免訪問無效內存。
7.3 三維數組
三維數組是C語言中的一種高維數據結構,用于存儲立體的數據。類似于二維數組,三維數組實際上是由多個二維數組組成的,每個二維數組代表三維數組的一個平面。
以下是三維數組的基本語法:
data_type array_name[depth_size][row_size][column_size];
在上述語法中,data_type
是數組中元素的數據類型,array_name
是數組的名稱,depth_size
是數組的深度,row_size
是數組的行數,column_size
是數組的列數。
以下是一個示例,展示如何聲明、初始化和訪問三維數組:
#include <stdio.h>int main() {int cube[2][3][4] = {{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}},{{13, 14, 15, 16},{17, 18, 19, 20},{21, 22, 23, 24}}};// 訪問和輸出三維數組元素for (int d = 0; d < 2; d++) {printf("Depth %d:\n", d + 1);for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {printf("%d ", cube[d][i][j]);}printf("\n");}printf("\n");}return 0;
}
在這個示例中,我們聲明了一個名為 cube
的2層3行4列的整數三維數組,然后初始化數組的各個元素,并使用三層循環來遍歷并輸出整個三維數組。
三維數組在模擬立體的數據、圖像處理等領域非常有用。注意,在訪問三維數組元素時,需要使用三個索引來指定深度、行和列的位置。同樣要確保索引不超出數組的范圍,以避免訪問無效內存。
8 函數
8.1 函數定義與使用
函數是C語言中的重要概念,用于將代碼組織成可重用、模塊化的塊。函數允許你將一段特定的功能代碼封裝起來,并在需要時通過調用函數來執行該功能。
以下是定義和調用函數的基本語法:
return_type function_name(parameters) {// 函數體,執行具體功能// 可以包含多條語句return value; // 返回值(可選)
}
在上述語法中:
return_type
是函數的返回類型,指定函數返回的數據類型(如int
、float
、void
等)。function_name
是函數的名稱,用于在其他地方調用函數。parameters
是函數的參數列表,用于接收函數調用時傳遞的參數。return value
(可選)是函數的返回語句,用于返回一個值給調用者。
以下是一個示例,展示如何定義和調用一個簡單的函數:
#include <stdio.h>// 函數定義
int add(int a, int b) {int result = a + b;return result;
}int main() {int num1 = 5, num2 = 7;// 調用函數并將返回值賦給變量int sum = add(num1, num2);printf("Sum: %d\n", sum);return 0;
}
在這個示例中,我們定義了一個名為 add
的函數,它接受兩個整數參數并返回它們的和。然后在 main
函數中調用了這個函數,并將返回的結果賦給變量 sum
,然后輸出了和。
需要注意的是,函數需要在調用之前進行聲明或定義。如果函數定義在 main
函數之后,你需要在 main
函數之前提供函數的原型聲明。函數的參數和返回類型在聲明和定義時需要一致。
C語言中的函數允許你將代碼劃分成更小的模塊,提高了代碼的可維護性和可讀性。它們還可以被多次調用,使代碼得到重復使用。
8.2 函數的參數
函數的參數是在函數定義中用于接收傳遞給函數的值的變量。參數允許你在函數內部使用外部傳入的數據,從而實現更通用和可定制的函數功能。
C語言中函數的參數可以分為兩種類型:形式參數(也稱為形參)和實際參數(也稱為實參)。
-
形式參數(形參):
形式參數是函數定義中聲明的參數,用于接收傳遞給函數的值。形式參數只在函數內部起作用,它們的值在函數調用時由實際參數傳遞。形式參數的聲明方式通常在函數的原型和定義中的參數列表中,例如:
int add(int a, int b) {// 函數體 }
-
實際參數(實參):
實際參數是在函數調用時提供的參數值。實際參數可以是常量、變量、表達式等。在函數調用時,實際參數的值被傳遞給形式參數,從而函數可以使用這些值進行計算或處理。在調用函數時,實際參數可以按照形式參數的順序進行傳遞,例如:
int main() {int result = add(5, 7); // 5和7是實際參數// ... }
函數的參數使得函數能夠處理不同的數據,并根據傳入的值執行相應的操作。在函數定義中,你可以在形式參數的位置使用這些參數,就像使用普通的變量一樣。調用函數時,實際參數的值會被復制到形式參數中,從而函數可以使用它們執行操作。
需要注意的是,參數的數據類型和順序在函數聲明和調用時必須一致。參數的名稱可以在函數定義和調用中不同,名稱只在函數內部起作用。
?
?