發表文章

目前顯示的是 6月, 2020的文章

PHP變數型別因需求自動轉換

PHP(寬鬆型別語言)的變數在使用前不用特別宣告類型,在使用該變數時PHP會自動轉換存取時所需的型別。 例如: <?php $integer=126*186; echo "$integer<br/>\n"; echo substr($integer,1,5); ?> 變數$integer=23436,此時是數字型別,當使用函式substr時,要求傳遞從第1個位置開始回傳連續5個數值,此時變數$integer即會自動轉型為字串,並且依照substr回傳3436,但是我們是請求5個數值,從3開始到最後也只有4個數字,沒有第5個,所以只會回傳3436。 字串 2 3 4 3 6 位置 0 1 2 3 4 若撰寫echo substr($integer,2,2); 則會回傳43。 在這裡substr函式用法是 substr ( 變數名稱 , 取值起始位置 , 連續取多少數量 ) 因函式substr請求,PHP編譯時會自動將變數轉為字串 字串也可能因為需求而轉為數字 求直角三角面積(ans=75) $a= "10"; $b= "15"; echo ($a*$b)/2; 提醒: 變數賦值 $a=10;//////數字 $a="10"////字元字串

多行文字指令多種處理方式

多行文字的echo陳述式: $myname= "WesWang"; echo "this line is headline<br/>\n         this line is first line.         this line is second line.         written by $myname<br/>\n"; 多行字串賦值: $myname= "WesWang"; $long_str= "this line is headline<br/>\n         this line is first line.         this line is second line.         written by $myname<br/>\n"; echo $long_str; 當然若需要換行,還是要在換行位置放入<br/>\n,這樣編譯器才會進行換行動作。 另一種多行的echo陳述式是使用運算子<<<提供多行字串,echo緊接<<<_END,結束字串時用_END來結束, 切記結束字串_END必須是新的一行且不可有任何空格或其他符號在同一行前後【除了;用以結束陳述】 。 多行的echo陳述式: $myname= "WesWang"; echo<<<_END         this line is headline<br/>\n         this line is first line.         this line is second line.         written by $myname<br/>\n. _END; <<<_END其實就像是雙引號,兩個_END標籤之間為表述內容,也會進行判斷或運算變數、運算子等等。 使用這個標籤不必運用\n進行換行,且運用單雙引號來區隔文字作為敘述也不需要使用\來轉義。<這裡指的是網頁原始碼,非網頁本身> 另外使用_END標籤,對於開發人員而言,代表可以

關於【字串型態】與【轉義字元】

PHP編譯器在編譯時,單引號【'】與雙引號【"】的使用會影響到編譯與判斷時產生出不同的結果,尤其有所謂的變數、字元或者一些運算子等等。 例如: $eat = '牛肉'; $meat = '雞豬牛羊魚:$eat'; 當使用單引號【'】時,最後$meat會得到[雞豬牛羊魚:$eat],而不會將變數$eat的內容寫入$meat。 但當使用雙引號【"】時: $eat = '牛肉'; $meat = "雞豬牛羊魚:$eat"; 編譯器境過判斷會將$eat視為變數,則[雞豬牛羊魚:牛肉]會存入變數$meat之中。 單引號可以視為字面上照單全收,沒有經過任何判斷或其他處理。 雙引號則是會將所有程式上的變數字元運算子....等等進行判斷運算處理。 轉義字元就像是在C語言中經常使用的跳脫字元使用方式與規則進而防止編譯器的誤判行為。 E.g: echo 'it's you're book'; 【X】 echo 'it\'s you\'re book';【O】 each "sell $ " . $money . " only today." 【X】 //紅色部分為運用【.】做字串接變數 each "sell \$ " . $money . " only today."【O】 //紅色部分為運用【.】做字串接變數

字串串接【.】和【.=】

(一) 在PHP中,字串串接方式是用句點【.】來進行串接,簡單練習一下。 $money=69; echo "sell \$ " . $money . " only today."; 畫面則會輸出 sell $ 69 only today. (二) 運用【.=】也可以將字串串接起來,舉例來說[$a.=$b;],則$a會保有其內容,將$b直接接在$a的最末端,練習一下。 $a='今晚吃'; $b='麻辣火鍋'; $c='好嗎?'; $a .= $b; echo $a,"<br/>\n"; 畫面輸出第一句 "今晚吃麻辣火鍋" 接著繼續 $a .= $c; echo $a,"<br/>\n"; 下一句輸出 "今晚吃麻辣火鍋好嗎?" 【.=】並非將原來字串變數$a取代,而是將兩變數$a、$b內容串接起來後再取代原來的字串變數$a。 利用教學書上的資料來練習。 $newflash = '台北高溫38.9 '; $newflash2 = '新北高溫36.9 '; $bulletin = '新聞布告: '; $bulletin  .=  $newflash; echo $bulletin,"<br/>\n";//////////新聞布告: 台北高溫38.9 $bulletin .= $newflash2; echo $bulletin,"<br/>\n";//////////新聞布告: 台北高溫38.9 新北高溫36.9

關於各種運算子

各種運算子的各種類型與運用方式,幾乎都與C語言相同。 算術運算子 +: $a=5+3; - : $a=5-3; *: $a=5*3; / : $a=5/3; %:$a=5%3; ++:++$a; -- :--$a; 賦值運算子 =   :$a=5 相同於 $a=15 += :$a+=5 相同於 $a=$a+5 -=  :$a-=5 相同於 $a=$a-5 *= :$a*=5 相同於 $a=$a*5 /=  :$a/=5 相同於 $a=$a/5 %=:$a%=5 相同於 $a=$a%5 .=  :$a.=$b 相同於 $a=$a.$b 比較運算子 == != > < >= <= 邏輯運算子 && and(幾乎同&&) || or(幾乎同or) ! xor(類似or)

PHP中的isset、unset指令

關於isset指令,適用於檢查變數、陣列等等對象的記憶體位置是否有存取任何東西,若該記憶體位置是空的(沒有存取任何東西)則會回傳0,若該記憶體位置有存取任何東西,則回傳1。 利用isset檢查變數中是否有東西: $site = "https://www.google.com/"; if(isset($site)==1){ echo  "<br/>\n" , $site , "<br/>\n" ; echo 'if成立' , "<br>\n" ; } 其結果會執行if內容,因為isset檢查$site回傳1。 若直接輸出,當變數不為空值(null),會輸出1,給予空值則不會輸出。 $hhh='A'; echo isset($hhh);                               <輸出1> $hhh=null; echo isset($hhh);                               <無輸出任何東西> 另外利用unset則是可以將已宣告的變數或陣列等等已定義之物件,刪除它的定義,在unset之後該物件就等於沒有了,不可再使用(因為沒有定義了)。 $n=array(array('5cm','15cm'),array('2.5cm','3.75cm')); for($i=0;$i<2;$i++){ for($j=0;$j<2;$j++){ echo $n[$i][$j]; } } 以上陣列依序正常輸出,若用isset檢查其中之一位置,因空間有儲存東西,所以為1。 unset($n); for($i=0;$i<2;$i++){ for($j=0;$j<2;$j++){ echo $n[$i][$j]; } } 經過unset後,$n陣列已經刪除,所以程式已無法判斷此物件,故會出現未定義(連續4

PHP基礎指令與編撰方式基本介紹(字串、變數、陣列與基本識別符號)

在編撰PHP內容時,PHP編譯器首先會找到識別範圍。 如: <?php           此為PHP編譯器識別範圍~ ?> 運用簡單的輸出指令echo來將字元輸出給html(畫面),這個echo指令與C的printf相似,當然在php也可以使用printf來輸出變數....等等。 至於在html畫面上若需要換行,需要加上html換行的字元<br/>,但它不會再php運行畫面上做換行,必須加上與c相同的換行字元\n。 另外撰寫過程中,註解方式與C相同,單行//,範圍/*~~*/。 分號'';''也是和C一樣為指令結束。 因為PHP為了加快其編譯速度,所以用$符號去判斷其後面變數屬性,在PHP不需要像C宣告型態int...char....(用$即可)。 字串$a="hi",$King="Queen's husband"; ("需要雙引號") 數值$a=10, 陣列$a=array(''H'',''i'',''apple'',''book'');或$a=array("52","20","69"); 二維陣列$a=array(array(''H'',''i''),                               (''apple'',''book''),                               ("cut","dreams")); 複製方式$user=$King; 基本中的基本練習~ <html>         <head>                 <title>測試頁面</title>         </head>         <body&g

第一次PHP基礎練習

在PHP與C語言中有許多共同處與觀念,只是運行格式與編撰行為有許多不同之處需要學習,一步步來,先從基本指令開始練習。 <head> <meta/> <title>測試網頁</title> </head> <body> <?php     $str = "Hello world!"; $num = 87; $num2= 33; echo($str),("<br/>\n"); echo("how are you<br/>\n"); echo($num),("<br/>\n"),($num2),("<br/>\n"); $num3= $num + $num2; echo($num3),("<br/>\n"); if($num2>$num){ echo($num2); }else{ echo("123456789"); } ?> </body> </html>

C語言基礎階段的學習心得

在每個語言都有其特性與長處、缺點,但在學習過程中許多軟體語言卻都有其相似之處,而每個語言又讓人有學之不盡的感覺。 而我選擇以C語言來當我對軟體語言的敲門磚與基礎,在學習過程中,讓人有許多挫折感,且認為怎麼學不完的狀況下,請教了一些前輩之後,才開始有些思考上的轉變,語感、邏輯、規律、慣用基礎指令等等真的是重中之重,最關鍵的還是我對於軟體語言上的認知已悄悄的轉變為工具及使用方式,雖然在知識與歷練上與諸位前輩還相距甚遠,但有接受到最重要的核心概念才是最重要的。 結論就是,除非這是你當下 經常 且 使用比重很大 的軟體語言需要比較常精進外,其他軟體語言只要是會接觸到的,不彷花一點時間去做基礎上的了解,但僅僅就是一點時間,在未來團隊合作上會有幫助。 當然要說我C語言都沒問題了、已經很精深了,這是不可能短期三五個月可以達成的(除非有其他程式語言身後底蘊),既使集中火力連續三個月每周40小時以上去學習,也僅僅只是使用規則、方式、撰寫邏輯...等等等的基礎養成(不要想太多,一個天才學3個月也不過 認真努力的 10年工程師)。 接下來我要 開啟PHP人生 了,這之中也許會學習Python,但無論如何,做web的就是要去稍微聊解前端的人在衝蝦咪,後端資料庫等等咧衝蝦毀,然後在自己工作領域範圍裏面,除了本身負責的部分,其他會接觸到的,甚至連結運用到的部分就是缺什麼知識能力就補什麼。 程式人不是年齡問題稱為老化,而是學習的心態,A君25歲開始寫了10年的人後才35歲,但是學習動力一旦停滯且開始故步自封了,就是老化其中象徵了;但B君35歲才開始的工程師,一旦保持著規律的工作時間後,加上像我一樣喜歡追求與使用新的科技知識並保持年輕的學習心態,在兩者10年之後,雖然A君有著20年的經驗,而B君只有10年的經驗,但在這之後若兩者心態與動力上依然相同於過往,在往後的日子會慢慢開始變得不一樣。 ※這不就是前陣子許多人常常掛在嘴上的......莫忘初衷嗎... 當然只要關於C語言上我有新的學習到的地方,還是會做筆記的,畢竟人的記憶體有點類似暫存記憶體,只是時間長短不同罷了~ 以上為近期集中學習的心得與個人感想,如果有他人沒事看完了,也請您不吝指教,多多給我這新進轉職者鞭策與鼓勵,敝人會感激在心的。 謝謝 李根逸博士 ( Feis老師 )在youtube提供的教學影片鞭打了我好幾個

呼叫另一個執行程式 – 指令system("程式檔名")

依我所知副程式的定義可以為獨立於主程式的函式、外部程式。 利用stdlib.h裡面的函式system("程式檔名")來執行程式內容,程式執行完成後可回傳值或不回傳皆可,這取決於主程式是否需要其含式的執行結果數值。【e.g: system("hello.exe")】 撰寫一個練習範例,主程式計算雞兔同籠後,呼叫另一程式,運行另一程式印出三角形後,回傳一個數值給主程式,主程式再計算另一程式共印出多少星星。 (主:雞兔計算,函式system呼叫副程式,接收副程式數值,印出副程式星星數) (副:被呼叫執行,輸入數值印三角形,回傳值給主程式) 主程式 #include<stdio.h> #include<stdlib.h> int main(){   srand(time(0));   int foot,head,ck,rb;   do{     printf("輸入腳數:");     scanf("%d",&foot);   }while((foot%2)!=0);   printf("輸入頭數:");   scanf("%d",&head);   ck=(head*4-foot)/2;   rb=head-ck;   if(ck<0){     printf("不合邏輯");   }else{     printf("CK=%d(2隻腳)\nRB=%d(4隻腳)\n",ck,rb);   }   printf("\nThis file will call hello.exe\n");   int g=system("hello.exe"); //g等於副程式執行完成後回傳的數值【return X;】   int st

輸入不定個數字串的優化【含strlen、strcmp[string.h]】

利用陣列去把每個任務條件分開,有點像是利用陣列、指標陣列、整數計數來分配任務,很有趣,也讓敝人更清楚除了指令以外,其實最重要的就是把一件任務利用指令的功能與邏輯性的思考去實現最終的結果。 另外在這裡有使用到strlen以及strcmp兩個在string.h之下的指令。 strlen 可以計算出該字元陣列實際輸入多少個字元,但不含\0。 e,g: str[5]="BOOK"; n=strlen(str); 所以n=4;代表有4個字元(不含\0,若完整則需要+1) strcmp 可以對比來源資料是否與條件設定相同,相同為0,不同為1。 e,g: char str[5]; scanf("%s",str); if(strcmp(str,"BOOK")==0){ printf("same"); }else{ printf("different"); } 以下範例為在其他大師傳授知識時給予的方法與意見,並非敝人撰寫,是跟著一起敲出來的,加上自己的筆記與註解。 #include<stdio.h> #include<string.h> int main(){         char raw[5000]; //總字串字元範圍(這裡設定5000字元)         char *str[100]; //紀錄每個字串第一個記憶體位址(這裡設定100組)         char input[50]; //每輸入一段字元上限值(這裡每次最多50字元)         int len=0; //用於紀錄一共輸入多少字串         int size=0; //紀錄全部一共輸入多少字元,以及給*str取 字串 目前為止位置         while(1){                 scanf("%s",input); //輸入字元                 if(strcmp(input,"END")==0){ // strcmp 用於比較參照值或字,相同於條件==0,不同為1                         break

二維陣列、二維指標陣列儲存字串差異與練習

#include<stdio.h> #include<string.h> int main(){ //宣告二維字元陣列,大小位置固定,但可逐個替換字獲選擇其需替換的字元         char str[3][4]={"how","are","you"};         printf("%s ",str[0]);         printf("%s ",str[1]);         printf("%s\n",str[2]);         str[0][0]='W';         for(int i=0;i<3;++i){                 printf("%s ",str[0+i]);         }         printf("\n"); //基本指令練習for、while、do while         for(int i=0;i<3;++i){                 printf("-");         }         int j=0;         while(j<3){                 printf(" line ");                 ++j;         }         j=0;         do{                 printf("-");                 ++j;         }while(j<3);         printf("\n另一個開始\n"); //字元指標陣列只可以整段一起替換,一但給予目標,不限陣列大小         char *b[3]={"eat","hot","dog"};         printf("%c%c%c\n",b[0][0],b[0

指令strcpy、strncpy基本運用【string.h】

簡單的指令運用,以及簡單練習。 #include <stdio.h> #include <string.h> int main(void){ char a[ ]="hi C"; char *aa[10]; strcpy(aa,a); printf("%s\n",a); printf("%s\n",aa); //以上為strcpy基本運用 //以下為strncpy基本運用 char b[ ]="TEST"; char bb[10]; strncpy(bb,b,2);//bb為儲存位置,b為複製來源,數值為複製字串陣列範圍大小 printf("before(b)= %s\nafter(bb)= %s\n",b,bb); //列印結果(因只複製兩個字元,bb剩餘空間自動為\0) //before(b)= TEST //after(bb)= TE     return 0; }

將二維陣列傳遞函式(需運用指標陣列)【自我延伸彈性版函式接收】

練習將二維陣列內容傳遞至函式運用,然後利用sizeof將陣列大小算出,套用迴圈後,即可讓不同大小二維陣列通用一個函式。 #include<stdio.h> void print(int **v,int x,int y){      int i,j;      for(i=0;i<x;i++){         for(j=0;j<y;++j){       printf("V[%d][%d]=%d\t",i,j,v[i][j]);       }       printf("\n"); } } int main(){      int v[3][3]={{1,2,3},{4,5,6},{7,8,9}}; //  int v[2][3]={{1,2,3},{4,5,6}}; //(求證用) //   int v[4][1]={{1},{2},{3},{4}}; //(求證用)     int x,y;      y=sizeof(*v)/4; //1個int為4,*v即為v[],每個v[]裡面有幾個空間即為y      x=sizeof(v)/4/y; //1個int為4,二維陣列全部占用多少空間除去y(每個v[]裡面的空間數)等於x      int *a[x]; //指標陣列有x個大      for(int i=0;i<x;++i){          a[i]=v[i];      } //將二維陣列v[x]隱性轉型後取址v[0]~v[x],位址存入指標陣列a[x]; //   printf("x=%d\ny=%d\n",x,y); //檢查用      print(a,x,y); //呼叫函式      return 0; }

C的動態記憶體配置realloc指令(記憶體另配置,舊位置自動釋放或原位置擴充)【realloc】-stdlib.h

#include<stdio.h> #include<stdlib.h> int main(){ int * v =0;// 0=空指標=(NULL) 若無給予指標位址,是一個 未定義行為 int length=0;// printf("please enter integers\n"); while(1){ int input; scanf("%d",&input); if(input==0){break;} v=realloc(v,sizeof(int)*(length+1)); 每執行一次realloc配置比前一次配置的陣列 大一個int空間,若當下該陣列後面的記憶體位置沒有使用,會原地擴充,若有會另外配置所需空間,將資料搬移過去後,原來位置空間釋放。 v[length]=input; //將此次輸入的數值存入陣列最後一個空間位置 ++length; //每次增加給下一輪使用(realloc配置陣列空間參數與象徵陣列大小) } for(int i=0;i<length;++i){ printf("%d ",v[i]); } return 0; }

C的動態記憶體配置malloc指令,以及釋放記憶體free指令運用【malloc】-stdlib.h

關於malloc所配置的記憶體空間,經過配置後是不會自己釋放消失的, 所以要配合free指令去將其所佔用記憶體釋放。 #include<stdio.h> #include<stdlib.h> int main(){ int * v =0;// 0=空指標=(NULL) 若無給予指標位址,是一個 未定義行為 int length=0;// printf("please enter integers\n"); while(1){ int input; scanf("%d",&input); if(input==0){break;} int* vn= malloc(sizeof(int)*(length+1)) ; //每執行一次malloc配置比前一次配置的陣列 大一個int空間 for(int i=0;i<length;++i){ vn[i]=v[i]; //將指標陣列" v" 的儲存內容(malloc配置陣列的位址) 複製到 指標 陣列" vn" } free(v) ; //釋放指標陣列 " v" 記憶體空間 v=vn; //把" vn " 的儲存內容複製到 陣列 指標陣列" v", //指標是彈性的~沒有空間限制 v[length]=input; //將此次輸入的數值存入陣列最後一個空間位置 ++length; //每次增加給下一輪使用(malloc配置陣列空間參數與象徵陣列大小) } for(int i=0;i<length;++i){ printf("%d ",v[i]); } return 0; }

自動變數生命週期

補充關於程式撰寫中,關於記憶體占用與釋放的觀念中,當宣告一個變數或陣列等等,一旦離開可視範圍{}之外,所占用的記憶體會自動釋放出來,例如: int main(){      int a;       for(int i=0;i<10;++i) {           int b[3]={0};           int c=5;           }      return 0; } 範例程式執行中, int i=0 、   int b[3]={0} 、 int c=5 一旦離開可視範圍 {} 後,其所占用的記憶體將會自動釋出,所以迴圈或者其他指令執行過程中,一旦執行過一次即會釋放,所以迴圈執行n次,就會重複占用(宣告)與釋放(執行第n次)記憶體n次。

將輸入的每組數字一起印出(沒事多練習)

練習輸入多組數字,直到輸入0或者到達陣列可儲存的最大量時,將其所輸入的每組數值印出。 #include<stdio.h> int main(){ int v[10]; int length=0; printf("please enter integers\n"); while(length!=10){ scanf("%d",&v[length]); if(v[length]==0){break;} ++length; } for(int i=0;i<length;++i){ printf("%d ",v[i]); } return 0; }

練習題目2(沒事多練習)

二、三角形輸出 題目:輸出下列圖形 輸出 1: 輸出 2: * 1 ** 12 *** 123 **** 1234 ***** 12345 輸出 3: 輸出 4: 1 1 12 12 123 123 1234 1234 12345 12 1234 123 123 1234 12 12345 1 123 1234 12345 123456 自解 #include<stdio.h> int main(){ int i,j,n; printf("請輸入數值:"); scanf("%d",&n); printf("\n輸出1\n"); //輸出1 for(i=0;i<n;++i){ for(j=0;j<=i;j++){ printf("*"); } printf("\n"); } printf("\n輸出2\n"); //輸出2 for(i=0;i<n;++i){ for(j=0;j<=i;j++){ printf("%d",j+1); } printf("\n"); } printf("\n輸出3\n"); //輸出3 for(i=0;i<n;++i){ for(j=0;j<=i;j++){ printf("%d",j+1); } printf("\n"); } for(i=0;i<n-1;++i){ for(j=0;j<n-1-i;++j){ printf("%d",j+1); } printf("\n"); } printf("\n輸出4\n"); //輸出4 int a=1; d

練習題目1(沒事多練習)

一、雞兔同籠 題目:某個籠子裡有一群雞和一群兔子,已知總共有 m 隻腳及 n 個頭,求雞和兔子的個數。 輸入:每行有兩個整數 m、n , m 為籠子裡的腳數, n 為籠子裡頭的個數。 輸出:每行輸出兩個數字,分別是雞的個數及兔子的個數。 測試輸入資料: 36 10 44 20 142 40 268 100 666 200 輸出結果: 2 8 18 2 9 31 66 34 67 133 #include<stdio.h> int main(){ int foot,head,ck,rb; do{ printf("輸入腳數、頭數:"); scanf("%d %d",&foot,&head); if(foot%2!=0||head>foot/2){ printf("無解(無效)的輸入\n請重新"); } }while(foot%2!=0||head>foot/2); ck=(4*head-foot)/2; rb=head-ck; printf("*ck*%d\n*rb*%d\n",ck,rb); return 0; }

補充使用命令判斷選擇(?)

在書中有看見了如何使用?來做判斷與選擇,它(?)是依照使用者付予的條件進行判斷,再把結果賦予給所指定的變數。 例如AM&PM判斷方式: int DAY,hour; printf("請輸入現在的時(0~24時)\n"); scanf("%d",&hour); DAY=(hour<12) ? 'A':'P'; printf("now is %cM",DAY);//若輸入13結果會秀出now is PM 這是一個使用者設定判斷條件後,交由電腦所接收的參數去做2選1的選擇,DAY是char型態,當條件為(hour<12), ? 為選擇'A' : 'P'為兩個候選者,成立選前者,不成立選後者,再賦予DAY資料。 當然條件改成hour>12,則成立或不成立的選擇就會對調。

同型別,不同型別的互轉(宣告型別與資料型別)

圖片
宣告型別有int,char,double...等等。 (const為修飾詞,是屬於另外加在型別前) 資料型別有陣列、指標、指標陣列...等等。 指標類型可以依照使用者自行去定義資料型別(int,double,char...等)後加入應用,當指標與指標之間有型別上的不同,且使用者有轉型需求的情況下,C語言又提供透過void類型的指標當成中繼轉換,例如: int A; void *change=&A; double *B=*change; 補充資訊(同一列皆可互換): 同類型別轉換(整數與整數,浮點數與浮點數) double = float   // (O) int = char          // (O) 整數與浮點數型別轉換 1.須注意精度問題,高精度轉到低精度會降低其精度(好像廢話=_=) 2.注意可能會有溢位造成精度上的或未定義行為的問題。 float = double   // (O) 無條件捨去 double = int      // (O) 陣列部分 int a[5]; int *b; const int *c; 陣列隱形轉性成指向低一個元素的指標(同類型別) b=a;//(int*) = (int [5]) // (O) a=b;//(int [5]) = (int *)// (X) (type*) to (const type*)(同類型別) c=b;//const int * = int *; (O) b=c;//int * = const int *; (?) 失去const意義且可能造成程式上無法預料或無法控制的結果 指標與指標之間 int *intA; double *doubleB; doubleB = &intA   // (?) 沒有強制禁止,但卻是不正確的行為 ( 效果無法保證 ) 如最前面所述,若有不同的指標與指標之間互相轉換,C有提供void *給使用者作兩者之間的中繼。 所有型別的指標都可以轉成void指標,且void指標都可以轉成所有型別的指標,這是少數C語言有定義的行為。 void *有點類似泛用型別 (void * = &int;)(float * = void;) int A; void   *chan