#include<stdio.h>
voidmain(){行爛
constintN=10;
doublex;
doublescore[N]={0};
double*px=&x;
*px=36.59;
【代碼1】//使用間接訪問方式將10賦給x
*px:px是指針,那麼*px就是解除了的普棗鄭通變數檔岩漏,與x完全等價
&px:是取px得存儲地址。
px:就是指針啦。
return0;
}
2. C語言變數的定義與使用
變數的存儲類別決定了變數中的數據在計算機內存中的存儲位置。C語言中局部變數存放在動態存儲區,全局變數或者靜態變數存放在靜態存儲區。下面是關於C語言變數的定義與使用,歡迎參考!
如果要為單片機控制系統編寫出高質量的C語言程序,合理的定義並使用變數是非常重要的。程序是用來處理數據的,而變數就是用來存儲數據的。每定義一個變數,編譯器就會在系統的RAM中分配一個物理存儲區域。在單片機控制系統中,RAM資源是非常有限的,作為單片機程序員,絕對不能隨意的定義變數,需要精打細算合理定義。為了實現這個目標,必須要對變數的多個特性有深刻的認識。
變數特性:
第一、變數定義要選擇恰到好處的類型,變數的類型直接決定了它所存儲的數據取值范圍,這類似於我們生活中使用的各種容器,選擇合適的變數類型,不但能保證數據存儲安全,還能有效的節約系統資源;
第二、變數的作用范圍必須清楚,C語言最基本的功能單元是函數,在函數內部使用的變數是私有變數,只能在函數內部使用。多個函數組成一個程序的功能模塊,並安置在某一個C文件中,在這些函數的頭部定義的變數是靜態變數(局部變數),這種類型的變數模塊內部的函數都可以訪問。如果在模塊內部聲明變數,並在該模塊的頭文件中導出,該類型變數就是全局變數,全局變數在整個工程中的所有函數都可以訪問;
第三、變數佔用的RAM資源,私有變數是可以釋放的,靜態變數與全局變數是不可以釋放的。也就是說在程序運行的整個過程中,私有變數佔用資源可以供不同的函數重復利用,而靜態變數與全局變數是完全被佔用不能重復利用的;
第四、變數可以存放常數,但因為單片機RAM資源有限,強烈建議不要用變數存放常量,而是在資源相對豐富的FlashROM中存放常量;
第五、局部變數與全局變數對於函數來說,訪問非常方便,但缺點顯而易見:訪問的函數越多,數據的安全性越低,一旦出現數據異常,很難排除問題。所以,請盡量減少局部變數與全局變數的使用;
第六、函數的型參個數盡量減少,這樣型參只會佔用通用寄存器組來完成參數傳遞工作。如果參數過多,編譯器可能會被迫分配佔用RAM資源,這樣不但參數傳遞效率變低,同時還會導致RAM資源浪費;
明確上述變數定義與使用特點後,在編寫程序的時候,一定要利用好這些特性並結合程序的特點,靈活的使用各種類型、各種作用范圍的變數,使程序在最大限度上得到優化,使系統性能提升至最優的狀態,才是我們嵌入式開發者的終極目標!
拓展:C語言入門學習
什麼人需要學習C語言?
從51JOB的統計數據來看,選擇C語言人才的企業多數以電子工程師、嵌入式工程師、硬體工程師、IOS工程師等為主,學歷本科以上相關專業,三年以上工作經驗,且外語水平要求至少四級以上。既然C語言學習者的就業門檻那麼高,為什麼還有很多人執著的去學習C語言呢?總結而言,無外乎以下幾點原由:
1)C語言不是面向對象語言。
因為這一點,任何學習C語言的人必須學會用函數思考問題。當你真正的去學習一門面向對象語言時,就會有C語言的函數學習基礎去對比。這會使學習面向對象編程更容易理解和更有樂趣。
2)用C編程就像進行智力體操。
你要顧及到每一件事情,而這在很多其他語言中他會為你處理。你要管理指針,內存分配,和內存回收。你要明白如何處理串,還有動態數據。在其他語言中,所有這些對你來說是隱藏的。你不知道他們如何運行,更不用說改變他們的運行方式了。你得到了使用的便利,失卻了對程序的控制和速度。很多情況下,這是筆值得的買賣。其他的情況下就不是這樣了。
3)不同情況下你會使用不同的編程語言。
某些情況下要求使用Lisp,其他的要Java,還有別的要C++。但是C是你堅實的基礎。你可能不會使用它做一些項目,但是它會幫助提高你的能力,熟練的用其他語言編程。
4)除了匯編語言之外,C代碼生成的程序比其他任何語言生成的程序來得更小和運行更快。
那麼為什麼不學匯編語言呢?匯編是一門學了很有用的.語言,但是它沒有C那樣的可移植性,並且其他流行的語言比如JAVA的語法是基於C的,而不是匯編。你仍然應該學匯編,但它並不會證明它會像學C那樣有用。
5)如果你想要寫一個視頻游戲引擎或操作系統,你會需要C。
你不能使用C#, Java, 或 Basic來完成這些編程任務。
C語言的發展史:
C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特點。它由美國貝爾研究所的D.M.Ritchie於1972年推出,1978年後,C語言已先後被移植到大、中、小及微型機上,它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。它的應用范圍廣泛,具備很強的數據處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,適於編寫系統軟體,三維,二維圖形和動畫,具體應用比如單片機以及嵌入式系統開發。
我適合學習C語言嗎?
首先我們要認清一個事實:C語言工作者只是眾多從事軟體開發者中的一小部分,在深圳這樣一個IT企業雲集的大城市,使用其它語言從事軟體開發的工作者多如牛毛,薪資待遇不比從事C語言開發的人低,當編程愛好者在選擇第一個編程語言時,C語言不一定是首先。我適合學習C語言嗎?解決這個問題,先回答以下幾個問題:
1)你學習C語言的目的是什麼?如果是想從事這方面的工作,那麼請義無反顧的堅持下去,推薦你在《微機原理》、《計算機組成原理》和《計算機系統結構》三本書中選一本配合《C語言程序設計》來看,這樣可以融匯貫通,讓你對編程有更深入更系統化的理解。而這種理解對計算機類學科的學習來說很重要。
2)您具備學習C語言的條件嗎?由於入職C語言編程的企業對入職者的要求比較高,在沒有編程工作經驗前提下多數想通過自學進入類似企業的人幾乎為零,包括很多計算機專業畢業的大、中專畢業生在校期間都會學到C語言,畢業出來後依然雲里霧里。C語言的開發,需要在實際工作中才能快速掌握。同時,英語(從事C語言開發需要經常查閱英文資料,尤其是單片機領域)、學歷、數學演算法、極強的邏輯思維能力等等也是讓多數人望而卻步的門檻。
3. 13)在C語言中,對變數的訪問方式是( )
文件的打開(fopen函數)
fopen函數用來打開一個文件,其調用的一般形式為:
文件指針名=fopen(文件名,使用文件方式);
其中,
「文件指針名」必須是被說明為FILE 類型的指針變數;
「文件名」是被打開文件的文件名;
「使用文件方式」是指文件的類型和操作要求。
「文件名」是字元串常量或字元串數組。
例如:
FILE *fp;
fp=("file a","r");
其意義是在當前目錄下打開文件file a,只允許進行「讀」操作,並使fp指向該文件。
又如:
FILE *fphzk
fphzk=("c:\\hzk16","rb")
其意義是打開C驅動器磁碟的根目錄下的文件hzk16,這是一個二進制文件,只允許按二進制方式進行讀操作。兩個反斜線「\\ 」中的第一個表示轉義字元,第二個表示根目錄。
使用文件的方式共有12種,下面給出了它們的符號和意義。
文件使用方式 意義
「rt」 只讀打開一個文本文件,只允許讀數據
「wt」 只寫打開或建立一個文本文件,只允許寫數據
「at」 追加打開一個文本文件,並在文件末尾寫數據
「rb」 只讀打開一個二進制文件,只允許讀數據
「wb」 只寫打開或建立一個二進制文件,只允許寫數據
「ab」 追加打開一個二進制文件,並在文件末尾寫數據
「rt+」 讀寫打開一個文本文件,允許讀和寫
「wt+」 讀寫打開或建立一個文本文件,允許讀寫
「at+」 讀寫打開一個文本文件,允許讀,或在文件末追加數據
「rb+」 讀寫打開一個二進制文件,允許讀和寫
「wb+」 讀寫打開或建立一個二進制文件,允許讀和寫
「ab+」 讀寫打開一個二進制文件,允許讀,或在文件末追加數據
對於文件使用方式有以下幾點說明:
1) 文件使用方式由r,w,a,t,b,+六個字元拼成,各字元的含義是:
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文本文件,可省略不寫
b(banary): 二進制文件
+: 讀和寫
2) 凡用「r」打開一個文件時,該文件必須已經存在,且只能從該文件讀出。
3) 用「w」打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經存在,則將該文件刪去,重建一個新文件。
4) 若要向一個已存在的文件追加新的信息,只能用「a」方式打開文件。但此時該文件必須是存在的,否則將會出錯。
5) 在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,並作相應的處理。因此常用以下程序段打開文件:
6) if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
getch();
exit(1);
}
這段程序的意義是,如果返回的指針為空,表示不能打開C盤根目錄下的hzk16文件,則給出提示信息「error on open c:\ hzk16 file!」,下一行getch()的功能是從鍵盤輸入一個字元,但不在屏幕上顯示。在這里,該行的作用是等待,只有當用戶從鍵盤敲任一鍵時,程序才繼續執行,因此用戶可利用這個等待時間閱讀出錯提示。敲鍵後執行exit(1)退出程序。
7) 把一個文本文件讀入內存時,要將ASCII碼轉換成二進制碼,而把文件以文本方式寫入磁碟時,也要把二進制碼轉換成ASCII碼,因此文本文件的讀寫要花費較多的轉換時間。對二進制文件的讀寫不存在這種轉換。
8) 標准輸入文件(鍵盤),標准輸出文件(顯示器),標准出錯輸出(出錯信息)是由系統打開的,可直接使用。
13.1.2 文件關閉函數(fclose函數)
文件一旦使用完畢,應用關閉文件函數把文件關閉,以避免文件的數據丟失等錯誤。
fclose函數調用的一般形式是:
fclose(文件指針);
例如:
fclose(fp);
正常完成關閉文件操作時,fclose函數返回值為0。如返回非零值則表示有錯誤發生。
13.2 文件的讀寫
對文件的讀和寫是最常用的文件操作。在C語言中提供了多種文件讀寫的函數:
•字元讀寫函數 :fgetc和fputc
•字元串讀寫函數:fgets和fputs
•數據塊讀寫函數:freed和fwrite
•格式化讀寫函數:fscanf和fprinf
使用以上函數都要求包含頭文件stdio.h。
4. C語言結構體指針成員所指向的變數如何訪問
第一種寫法:
(*a).p=&b;
.的優先順序高於*,(*pointer)兩邊的括弧不能少。如果去掉括弧寫作*pointer.memberName,那麼就等效於*(pointer.memberName),這樣意義就完全不對了。
第二種寫法:
a->p=&b;
->是一個新的運算符,習慣稱它為「箭頭」,有了它,可以通過結構體指針直接取得結構體成員;這也是->在C語言中的唯一用途。
結構體是一種數據類型,是一種創建變數的模板,編譯器不會為它分配內存空間,就像 int、float、char 這些關鍵字本身不佔用內存一樣;結構體變數才包含實實在在的數據,才需要內存來存儲。下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變數。
(4)c語言變數訪問擴展閱讀:
用指針引用結構體變數成員方式總結與技巧:
一、(*指針變數名).成員名
注意,*p 兩邊的括弧不可省略,因為成員運算符「.」的優先順序高於指針運算符「*」,所以如果 *p 兩邊的括弧省略的話,那麼 *p.num 就等價於 *(p.num) 了。
因為指針變數 p 指向的是結構體變數第一個成員的地址,即字元數組 name 的首地址,所以 p 和 (*p).name 是等價的。
「等價」僅僅是說它們表示的是同一個內存單元的地址,但它們的類型是不同的。指針變數 p 是 struct 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能將 (*p).name 改成 p。用 %s 進行輸入或輸出時,輸入參數或輸出參數也只能寫成 (*p).name 而不能寫成 p。
二、直接用:指針變數名->成員名
來代替,它們是等價的。「->」是「指向結構體成員運算符」,它的優先順序同結構體成員運算符「.」一樣高。p->num 的含義是:指針變數 p 所指向的結構體變數中的 num 成員。p->num 最終代表的就是 num 這個成員中的內容。