首頁 > 軟體

C語言基礎知識分享續篇

2023-01-24 14:00:46

寫在前面

好了,現在我們開始C語言的第二個部分.今天我們需要看下面幾個知識點,都是非常簡單的,我們主要認識一下.

陣列

我們知道一個一個屬性可以用一個型別去表示,那麼我想問的是如果是一個屬性的多個呢?也就是多個一樣的東西,此時我們就要使用陣列來進行表示,所謂的陣列就是儲存資料的容器,保證多個資料的資料型別要一致,C語言中給了陣列的定義:一組相同型別元素的集合.

陣列使用

我們想要儲存1~10這幾個資料我們應該如何儲存?很簡單.

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定義一個整形陣列,最多放10個元素陣列存取

注意了,如果我們沒有在[]中具體元素的個數,那麼我們實際儲存元素的個數按照後面初始化的個數來進行計算,如果給了實際元素的個數,那麼我們後面最多儲存元素就是規定的元素個數.我們如果存取陣列的元素,那麼我們就要依賴陣列的下標,記住陣列的下標是從0開始的,這一點非常重要.

int main()
{
int i = 0;
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (i = 0; i<10; i++)
{
printf("%d ", arr[i]);
}
printf("n");
return 0;
}

函數

所謂的函數我們可以稱之為是程式碼的功能的集合,我們把程式不同的功能寫成一個個函數,這樣我們後面是可以再其他地方重複呼叫的.其中main函數也是一個函數.函數的基本結構是

放回置 函數名(參數列)
{
函數體
}

我們來實現一個列印1-10的函數.

void Print()
{
for (int i = 0; i < 10; i++)
{
printf("%d ",i+1); // ??)--]-三字母詞
}
}

我們呼叫函數只需要用函數名和相關的引數就可以了.

int main()
{
Print();
return 0;
}

字串

在C語言中用一對""括起來的字元我們稱之為字串,就像"hello world".注意我們C語言是沒有字串型別的,大家不要搞錯了就行.

在C語言中字串的末尾其實隱藏著一個'';y也就是隻要你使用雙引號輸入一個字串,它的末尾就是自動攜帶一個''來作為字串的結束標誌,實際在記憶體中,上面的字串是這樣的“hello world"末尾帶了一個''來作為結束標誌.我們驗證一下.

#include <stdio.h>
int main()
{
char * str = "hello world";

return 0;
}

上面我們驗證的還是不太清楚,這裡我們再次看一個現象.

#include <stdio.h>
int main()
{
char arr1[] = { 'a', 'b', 'c', 'd' };
char arr2[] = { 'a', 'b', 'c', 'd','' };
char* arr3 = "abcd";
printf("arr1 %sn", arr1);
printf("arr2 %sn", arr2);
printf("arr3 %sn", arr3);
return 0;
}

也就是所謂的字串我們可以這樣認為,我們可以認為他們是字元陣列,但是字元陣列最後我們一定要帶上一個'',注意我們是這麼理解,實質肯定有所不同,我們先不談,這涉及到其他的內容.

strlen && sizeof

我們談到字串和字元陣列我們就不得不說一下strlen和sizeof得區別了,記住了它最大得一個區別,sizeof是關鍵字,strlen是函數,這是本質得不同.在功能呢上,sizeof計算是我們陣列開闢得空間,它的單位是位元組,strlen是計算有效字元的個數,所謂的有效字元是指''之前的都是有效字元.

sizeof

我們先來測試一下sizeof關鍵字.

int main()
{
char arr1[] = { 'a', 'b', 'c', 'd' };
char arr2[] = { 'a', 'b', 'c', 'd', '' };
char arr3[10] = { 'a', 'b', 'c', 'd', '' };
printf("arr1 %dn", sizeof(arr1));
printf("arr2 %dn", sizeof(arr2));
printf("arr3 %dn", sizeof(arr3));

return 0;
}

這個我們已經知道了,那麼我們這裡在和大家說一下sizeof的的用法,我們sizeof既可以計算型別的大小,也可以計算變數佔據空間的大小.

int main()
{
int a = 0;
printf("int %dn", sizeof(int));
printf("a %dn", sizeof(a));
return 0;
}

但是我們計算型別和計算變數是有一點區別的,計算變數我們可以不帶括號.

int main()
{
int a = 0;

printf("a %dn", sizeof a);

return 0;
}

但是我們引數是型別的時候我們必須帶上括號.

int main()
{
int a = 0;

printf("int %dn", sizeof int);

return 0;
}

strlen

下面我們開始用一下strlen函數,這個是在標準庫string.h中的,我們使用前需要引入標頭檔案.strlen函數就是為了尋找字元'',知道知道'',否則我們會一直計數.

int main()
{
char arr1[] = { 'a', 'b', 'c', 'd' };
char arr2[] = { 'a', 'b', 'c', 'd', '' };
char* arr3 = "abcd";
printf("arr1 %dn", strlen(arr1));
printf("arr2 %dn", strlen(arr2));
printf("arr3 %dn", strlen(arr3));

return 0;
}

跳脫字元

假如我們要在螢幕上列印一個目錄:c:codetest.c.我們該如何寫程式碼,是不是按部就班的直接複製貼上.看一下現象.

int main()
{

printf("%sn", "c:codetest.c");

return 0;
}

此時我們就會發現和我們想的有點不太一樣.是我們想錯了嗎?不是的,是大家缺了一個知識點.在C語言中,為了我們資料的列印更加優美,此時新增了很多的跳脫字元.什麼是跳脫字元,這個就是改變了原本意思的字元.今天我們用一下常見的跳脫字元.

跳脫字元

說明

?

在書寫連續多個問號時使用,防止他們被解析成三字母詞

\'

用於表示字元常數'

用於表示一個字串內部的雙引號

\

用於表示一個反斜槓,防止它被解釋為一個跳脫序列符。

a

警告字元,蜂鳴

b

退格符

f

進紙符

n

換行

r

回車

t

水平製表符

ddd

ddd表示1~3個八進位制的數位。 如: 130 X

xdd

dd表示2個十六進位制數位。 如: x30 0

下面我們認識一下三字母詞

int main()
{
printf("(are you ok??)"); // ??)--]-三字母詞
return 0;
}

在一些老的編譯器??)會被解析成],不過現在的編譯器一般不這麼幹了,我們瞭解就可了.

我們說一下常見的一些跳脫字元,其餘的就不談了,有興趣的自己可以查一查驗證一下就可以了,很簡單的.

\ 如果我們想要列印 字元'\' ,在的前面再加一個就行了ddd 這裡面ddd表示的是3個8進位制數,可以使用1-3個8進位制數xdd dd表示的兩個十六進位制數

下面我們來練習一個習題,我們求一下字串的長度

#include<stdio.h>
#include <string.h>
int main()
{
char* str = "c:test328test.c";
printf("%dn", strlen(str));
return 0;
}

這個字串的長度是4,就是下面的“c : t e s t 32 8 t e s t . c”

操作符

這裡只是認識,後面的再說吧.

算數操作符: + - * / %邏輯操作符: && ||移位元運算符: >> <<賦值操作符: = += -= *= /= &= ^= |= >>= <<=位元運算符: & ^ |條件操作符: exp1 ? exp2 : exp3逗號表示式: exp1, exp2, exp3, …expN

下面我們只說一下逗號表示式,所謂的逗號表示式就是我們根據從左到右的規則依次往後面計算,該賦值的賦值,該替換的替換.

int main()
{
int a = 0;
(a = 2 * 6, a * 3, a = a + 5);
printf("a = %dn", a);
return 0;
}

選擇語句

所謂的選擇語句就是我們在眾多的選項中選擇一個符合調價的,我們這裡有下面兩個類別.

if else

我們先用一下你就明白了,很簡單.

int main()
{
int coding = 0;
printf("你會去敲程式碼嗎?(選擇1 or 0):>");
scanf("%d", &coding);
if (coding == 1)
{
printf("堅持,你會有好offern");
}
else
{
printf("放棄,回家賣紅薯n");
}
return 0;
}

此時我們就明白了他們的含義,如果我們符合條件,那麼我們就執行該條件下的程式碼.那麼我想問一下我們只有這兩個個條件嗎?不是的,我們也是可以田間else if 的.

int main()
{
int coding = 0;
printf("你會去敲程式碼嗎?(選擇1 or 0 or -1):>");
scanf("%d", &coding);
if (coding == 1)
{
printf("堅持,你會有好offern");
}
else if (coding == -1)
{
printf("如果你是百萬富翁當我沒說話n");
}
else
{
printf("放棄,回家賣紅薯n");
}
return 0;
}

同時我們else if和else都是可以省略的,只保留if,但是我們絕對不可以只讓else或者是else的個數多餘if.注意else是和它上面最近的if進行匹配的,這裡我就不詳細的說了,你一驗證就明白了.

switch

除了if else選擇之外我們還是有另外的一個語法的,這裡也是很簡單的.

int main()
{
int a = 1;
switch (a)
{

case 1:
printf("%sn","YES");
break;
case 0:
printf("%sn", "NO");
break;
default:
printf("%sn", "選擇錯誤");
break;
}
return 0;
}

switch()的括號的內部元素型別 位元組<=4的整型(char int byte short)每一個case後面,除非是特殊業務要求,要帶上break;

int main()
{
int a = 1;
switch (a)
{

case 1:
printf("%sn", "YES");
case 0:
printf("%sn", "NO");
default:
printf("%sn", "選擇錯誤");
}
return 0;
}

迴圈語句

我們剛剛說了選擇語句,但是這個語句只會執行一次。由於我們發現生活中很多的實際的例子是:同一件事情我們需要完成很多次。那我們怎麼做呢?這裡就需要回圈語句了,這裡的迴圈語句三個。

  • for
  • while
  • do while

for

這個格式是for(表示式1; 表示式2; 表示式3),也是很好用的

表示式1 為初始化部分,用於初始化迴圈變數的。表示式2 為條件判斷部分,用於判斷迴圈時候終止。表示式3 為調整部分,用於迴圈條件的調整。

int main()
{
for (int i = 0; i < 10; i++)
{

printf("%d ", (i + 1));
}
return 0;
}

這裡我們想和大家說一個結論,條件判斷部分要比調整部分多上一次,有的選擇題會進行考察.

while

我們也是使用它進行列印1-到10的數位,這個也是非常簡單的.

int main()
{
int i = 0;
while (i<10)
{

printf("%d ", (i + 1));
i++;
}
return 0;
}

do while

如果說while語句是先進行條件判斷,那麼dowhile就是先執行程式碼,後面再進行條件判斷.

int main()
{
int i = 0;
do{
printf("i: %dn",i);

} while (i > 0);

return 0;
}

跳出語句

跳出語句算是對迴圈語句做一個補充,我們知道,任何一個人都有可能再滿足一定情況下結束迴圈,有的人會等到條件完成後結束,有的人可能中途有新增了另外的條件,此時我們下面的兩個關鍵子都是為了他們準備的.

contine

contine關鍵字是跳出本次迴圈,繼續下一次的迴圈.

int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
continue;
}
printf("i: %dn", i);

}

return 0;
}

break

break語句更加直接,它是直接結束迴圈.

int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
break;
}
printf("i: %dn", i);

}

return 0;
}

指標

下面我們談C語言最重要的也是最讓人難以理解的一個內容,這我們在後面會重點談.大家記住,所謂的指標我們就認為它是一個地址,它是指向一個事物的標誌,這就是指標的簡單理解.根據計算機主線的根數不同,指標分為4位元組和8位元組,其中32為機器是4位元組,64位元是8位元組.

int main()
{

int a = 10;
int * p = &a; // p 就是一個指標
printf("%dn", sizeof(p));
return 0;
}

那麼我想問的是我們拿到了a的地址,請問我們如何看待a的內容呢?這裡可以使用解除參照,解除參照就是根據地址找到那一片的空間.

int main()
{

int a = 10;
int * p = &a;
printf("a = %dn", *p);
*p = 20;
printf("a = %dn", a);

return 0;
}

這裡我想和大家說的,任何指標型別的大小隻要機器的位數確定,那麼我們位元組數也就確定了.

struct Student
{
char name[100]; // 姓名
char sex[10];// 性別
int age; // 年齡
};

int main()
{
printf("char %dn", sizeof(char*));

printf("int %dn", sizeof(int*));
printf("double %dn", sizeof(double*));
printf("struct Student %dn", sizeof(struct Student*));
return 0;
}

自定義型別

上面我們已經知道了自定義型別,也就是int之類的.那麼我想問的是如果我們想要描述學生這個屬性,我們應該怎麼辦?此時我們知道用自定義型別是可以描述的,但是我們有點麻煩,這裡C語言提供了一個關鍵字,我們可以使用它來自己定義型別.

struct

這個一個結構體關鍵字,我們可以這麼做.

struct Student
{
char name[100]; // 姓名
char sex[10];// 性別
int age; // 年齡
};

這就是一個結構體,也就是下面的格式

struct 結構體名字
{
// 成員屬性
};

這裡我們需要記住的是struct 結構體名字才是結構體的型別,大家不要記混了.這裡給大家使用一下.

struct Student
{
char name[100]; // 姓名
char sex[10];// 性別
int age; // 年齡
};
int main()
{

struct Student stu = { "張三", "男", 18};
printf("%s %s %dn", stu.name, stu.sex, stu.age);
return 0;
}

以上就是C語言基礎知識分享續篇的詳細內容,更多關於C語言基礎的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com