目前分類:C語言 (13)

瀏覽方式: 標題列表 簡短摘要

 

  • 動態配置空間不會消失,所以使用完用不到需要用free釋放空間
  • 所有配置記憶體函數,都會回傳配置區域第一個指標,若無法配置(Allocate),回傳NULL
  • 所有配置記憶體函數,因回傳為Void*(泛型指標),需用(類型)將回傳指轉型成要存入的指標類型
  • 所有配置記憶體函數,都需宣告一個指標來存取
  • 若直接宣告陣列,該陣列名稱為一個常數位址,動態配置之陣列為變數指標
  • 陣列無法用變數指定大小,而動態配置可以

malloc

  1. malloc會配置所要求的記憶體空間並回傳該區第一個指標,所配置的空間無初始化
  2. 定義的指標=(資料型態*)malloc(要分配的大小) //malloc會回傳所配置的空間第一個位址
  3. sizeof(資料型態) //自動取得該型態大小
  4. (資料型態)//將之後方的東西轉換成該資料型態
文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

  • Mar 23 Thu 2017 17:12
  • 陣列

陣列就是一次宣告很多變數
為什麼要一次宣告很多變數?假設要寫輸入一千筆資料,且每筆資料都要交互運算,那要設int a1,a2,a3....a10000嗎,然後這時候後面的數字不可以是變數,比方說我用一個ai但是你並沒有宣告ai這個變數,但如果使用陣列,就可以填入索引a[i]這樣就會自動變成第i個a
宣告

類型 陣列名稱[長度];
int arr[20];//int 陣列

陣列等同於宣告長度那麼多個變數,只要在中括號內填入數字(也可以是變數),就可以取得變數
陣列的索引是由0~長度-1也就是假如我宣告長度20的arr陣列,則arr[0]~arr[19]存在,arr[20]不存在。
二維陣列
二維陣列跟一維振烈的概念相同,也是宣告很多個變數,只是這個陣列存在兩個索引,所以有平面的感覺
宣告

類型 陣列名稱[長度1][長度2];
long looooooooong[999][5];//long 2維陣列

因為C語言並不實際支援二維陣列,所以二維陣列是由一維陣列模擬的,所以後方括號省略可以單獨形成一維陣列,則該一維陣列為每個第二維陣列
N維陣列
宣告

類型 陣列名稱[長度1][長度2]......[長度n];
char str[20][40][60][80][100];//char 5維陣列

概念同上
初始值
陣列宣告後,與變數相同,可以給予初始值,每個維度用一個大括號包含(一個Set),每個變數的值(一個element)用一個逗號隔開,形成集合表達方式,越後方的中括號為前面中括號的子集合(subset)

類型 陣列名稱[長度]={內容1,內容2,...,內容n}//一維陣列 初始值
類型 陣列名稱[長度1][長度2]={{內容1,內容2,...,內容n(長度2)},{內容1,內容2,....,內容n(長度2)},...,{內容1,內容2,....,內容n(長度2)}(長度1)}//二維陣列 初始值
//...以此類推
int arr[6]={0,1,2,3,4,5};
int arr[3][2]={{0,1},{2,3},{4,5}};
char arr[2][4][3]={{{'s','o',',',},{'n','a','w'},{'a','n','a'},{'w','a','i'}},{{'c','o','o'},{'l','f','a'},{'c','e','b'},{'o','o','k'}}}
文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

  • Mar 18 Sat 2017 14:49
  • 迴圈

迴圈就是某段程式碼要重複執行
C語言分三種迴圈for,while,do..while

基本上,都是只要條件成立就會繼續執行,所以是可以互換的,只差在for跟while是先判斷條件在執行,do...while則是先執行到下面才判斷條件是否成立。

跳脫(break)與繼續(continue)

break; 只要在迴圈內執行這個指令,迴圈就會跳脫(不繼續loop)
continue; 只要在迴圈內執行這個指令,迴圈會直接開始下一圈

迴圈與if相同,只要單行都可以省略大括號

 

for迴圈

for(初始指令;條件;迴圈末端執行指令)
{
    成立時執行的指令;
}

文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

C的條件判斷有多種表達方式 
最基本的

if

if(條件) {成立時執行;...}

這種表達方式 條件處可以是比較 比方x>0 a==b也可以狀況邏輯運算 如 a>b||a>10&&a!=99(a大於b或a大於10或且a不等於99時)
當執行時只有一行 則大括弧可以省略

條件

條件的運算為一個布林運算,且在C語言中1為True,0為False,布林運算可以是比較類的運算
可以用&&(且)或||(或)或!(非)等來做多個邏輯運算,比方說a==1&&b!=2||c>4 (a是1且b不是2或c>4時為True)

if...else...

if(條件){成立時執行;...}else{不成立時執行;...}

這樣的表達方式是同時有兩面的,也就是沒成立時,一定還會執行不成立的那個code,else也是當執行時只有一行 則大括弧可以省略

if...else if...else

if(條件){...}
else if(條件){...}
else if(條件){...}
else {...}

文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

寫過VB就知道Function輸入時可選擇ByVal(傳值)或ByRef(傳址)
兩者差別就是ByVal變數在Function內的值與傳入的變數無相關,也就是在Function內怎麼變動,傳進來的那個變數依然不變
ByRef變數,在Function內改變變數值,呼叫者傳入的變數就跟著改變(兩者同步)
所以介紹這兩種Function輸入方式在C的實現方式

傳值 (By Value)

傳值類型就跟上一個介紹的輸入值相同,就是輸入一個變數,變數會複製外界傳入的值到該宣告變數,然後任其改變也不會影響外面的變數。

範例 傳值 外界變數不改變

文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

  • Mar 12 Sun 2017 14:34
  • 函數

函數(function)

Function的用意就是將重複使用的程式碼,寫成一個區塊再給他一個名字,這樣要用的時候只要呼叫(Call)那個名字就好了,但是Function外面的變數並不會跟Function內的變數共用,所以有輸入值(Function處理所需要的值),然後也可以帶入之後返回一個值如(a=sin(2*pi)),像sin這樣帶入之後就直接變成一個值然後指派給a就是有回傳值的Function,而沒有回傳值的Function通常是拿來做不需要回傳,或者需要處理大於一個變數所用。
 

函數宣告

回傳值類型 函數名稱(輸入值類型 輸入值,.../*可選*/) 
{ 
    函數內的程式碼;
    ... 
    return 回傳值;//此行可選(與回傳類型有關) 
}

回傳值類型

主要分兩種

  1. 有回傳(函數Function):種類跟一般變數的種類一樣 如
    • int
    • float
    • char 等等..
文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

  • Mar 12 Sun 2017 14:04
  • 指標

指標(pointer)

就字面上來理解,指標就是箭頭
在C語言裡也差不多是那個意思,C語言稱作"中階語言"正是因為它很接近硬體
可以直接操作硬體,指標就是操作記憶體
那到底跟箭頭有甚麼關係呢?
每個變數都要存到記憶體裡面,每個記憶體都有一個編號
就跟地址一樣,也就是說我告訴你那個地址,你就可以找到那個變數
位址→變數(所以有箭頭的感覺)

文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

  • Mar 12 Sun 2017 13:29
  • 輸入

輸入同樣也是在stdio.h內

輸入
scanf("格式化字串",變數位址,...);

scanf與printf相同都採用格式化字串來做輸入,但是scanf一定要有變數在後方,為甚麼?因為沒東西存怎麼輸入
但注意到的是,scanf的變數是以位址的方式,也就是一般輸入的時候要在變數前面加上&(取得變數位址)這個operator
在這樣的用法下,&並不是作為字元且運算
格式化字串表取自wiki(藍色常用)

關鍵字

格式化字串
char  %c
unsigned char  %c, %hhu
signed char  %c, %hhd, %hhi
int  %i, %d
unsigned int  %u
signed int  %i, %d
short int  %hi, %hd
unsigned short  %hu
文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

  • Mar 12 Sun 2017 09:53
  • 輸出

C語言輸入輸出需引用Stdio.h,這也是為甚麼基本架構上面會有#include<stdio.h>這行的原因

輸出
printf("格式化字串",可選的變數);

printf這個函數 預設可以填入一個字串,後面可以以逗號加上無限多個變數,如果只有字串,則指輸出字串,如大家最喜歡的哈樓沃德(hello,world)
範例 hello,world

 

 

#include <stdio.h>
int main()
{
printf("hello,world");
return 0;
}
文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

運算子(operator)就是在做運算時的符號,運算不單單包含數學運算,與變數宣告是相同的,有算數(+-*/)、邏輯(And Or Not)、位元處理(2進位0101)、比較(><==!=)、指派(=)等..,但注意到的是與數學不同的地方,所有變數在左方被右方值指派(assign)(x=2+5),並不會有兩個以上的變數在左邊(2x+5=7或2x+3y=4z+9這種的),且運算子有分優先順序,比方算術運算比邏輯優先(比方2+5==1+6,2+5跟1+6先做才比較)
運算子

  • 算術類
    • +
    • -
    • * 乘
    • / 除
    • % 取餘數
文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

直接固定都不會再執行期間改變的數大都為常數(const),與數學上的意思是相同的

如 1(整數常數)、3.14(浮點數常數)、'a'(字元常數)、"<3"字串常數

在程式語言中常會需要用到改變的內容

如 使用者要輸入一個值,然後設計者再透過這個值做計算得出一個值,這時候就需要用一個變數來存使用者輸入的資料(因為使用者要輸入的值在設計時是一個未知數),所以這時候就需要用到變數了,跟數學假設一個x其實差不多的,只是你要讓電腦知道你有這個x,他存著什麼。

但是變數也有分很多種類,如下(藍字為最基本常用)

文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()

屬性類
size_t strlen(const char *s);//取得字串長度回傳(直到\0)
複製類 
char *strcpy(char *str1, char *str2); 
// 將str2 copy到str1內 
char *strncpy(char *destin, char *source, int maxlen); 
//從source字串的第0個字元開始copy maxlen個字元長度的字串到destin 
char *strdup(char *str); 
//將copy的字串做成回傳值 指派給前方的字串 如 strdest=strdup(strsrc);
連接類
char *strcat(char *s1, const char *s2); 
//將s2接到s1後面 同C++ s2+s1 同VB s2 & s1 
char *strncat(char *s1, const char *s2, size_t n); 
//將s2其中n個字元(如果s2小於n就取整個s2)接到s1後面
切割類
char *strtok(char *s1, const char *s2); 
//第一次使用將s1以s2作為分隔符號切割(插入結束符號)傳回字串開頭指標 
//第二次傳入NULL繼續切割再以s2切割s1再(插入結束符號)傳回第二段切割字串開頭指標 
//n次 傳入NULL繼續切割 再傳回第n段前方的開頭指標

繩繩 發表在 痞客邦 留言(0) 人氣()

下為一基本c語言可以執行的結構

#include<stdio.h>//前置處理器(引用STandardInput&Output.Headfile(標準輸入輸出標頭檔))
int main()//主程式(整數回傳 名為main的function)
{
    return 0;//回傳整數0
}

 

文章標籤

繩繩 發表在 痞客邦 留言(0) 人氣()