⑴ C語言 枚舉類型屬於 基本類型還是構造類型
吉林大學出版社裡的枚舉類型屬於構造類型,我也覺得它是構造類型,因為枚舉類型是有基本類型構造組合出來的。
⑵ c語言入門教學
樓主,你可以去編程入門網,那裡有挺多知識點的,很多語言都有,很適合初學者,你也可以去CSDN,那裡有很多源代碼提供下載,也有論壇,呵呵,你也不要忽視網路貼吧,知道,貼吧是學習很多課本沒有東西的地方,知道,你需要看解決答案,這樣很有收獲,你也可以去中國編程網,不過,我覺得一樓也是有道理的,看看書掌握知識點,網上我覺得主要還是提高的地方哦……呵呵……關於怎麼學,我是這么過來的,每看一節書,做一節課後習題,其實初學主要還是學習語法和演算法(解決問題的方法),多上機自己寫程序,寫不出來看答案的演算法,自己再寫一邊,關鍵這個階段還是積累為主,基本知識學好了,可以學深入編程,不過你需要有熟悉的語法,可以寫一些小程序:學生成績管理系統等等,就過關了,然後可以學習鏈表,圖像編程,等等高級編程……呵呵……努力一定有回報的……加油吧…
⑶ C語言中 局部變數和全局變數都是存儲在什麼區
C語言中局部變數存在棧里,全局變數存靜態存儲區。
局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。
全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;
(3)c語言深度解剖pdf擴展閱讀
C語言中局部變數和全局變數示例:
#include<stdio.h>
#include<malloc.h>
staticints1=0,s2=0,s3=0;//靜態變數放在靜態區
intg1=0,g2=0,g3=0;//全局變數放在靜態區
voidmain()
{
staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數
inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區
charc1[]="aabb";//局部變數放在棧區
char*c2="aabb";//字元常量放在靜態區
char*m1=(char*)malloc(1);//堆區
char*m2=(char*)malloc(1);//堆區
char*m3=(char*)malloc(1);//堆區
printf("動態數據區 ");
printf("a1 a2 a3 ",&a1,&a2,&a3);
printf("c1 ",c1);
printf("m1 m2 m3 ",&m1,&m2,&m3);
printf("靜態數據區 ");
printf("s1 s2 s3 ",&s1,&s2,&s3);
printf("g1 g2 g3 ",&g1,&g2,&g3);
printf("s4 s5 s6 ",&s4,&s5,&s6);
printf("c2 ",c2);
}
⑷ 介紹幾本學習c語言的書,譚浩強的就算了
清華大學出版的《C程序設計》,比較權威,另外你還可以參考一些相關 的習題什麼的,主要是編程知識,剛入門的時候可能會比較難,不過以後了解了原理之後就不會覺得太難了,另外你學習的時候還需要VISUAL C++軟體
⑸ 求大神::C語言的 &數組名 和 數組名的區別
1.&數組名作參數傳遞肯定是不對的,你看一下C語言書中關於數組作參數就知道了(裡面例子也能反應)
2.&數組名相當於指針的指針,指向數組名,而數組名又是一個數組的首地址,求sizeof結果是一下的,返回的都是數組的大小
3.&符號有去地址的作用,而數組名本身也是一個地址,它指向的數組的第一行。&數組指向的數組名,是指針的指針。所以才會有:&數組名類型是 int (*)[],而數組類型是int []
⑹ C語言有什麼用
C是基礎,不是很難的,看完基礎,如果想深入了解,你可以看《C專家編程》,和《深度C語言解剖》,其實最主要的就是你在學習的過程中,要不斷的上機實踐,理論知識加實踐是學好一門語言的公理。
說的那幾本書,在網路文庫裡面可以搜索到,不過一定要先看基礎,在看《C專家編程》,
譚浩強的《C語言程序設計》->《深度C語言解剖》->《C專家編程》.
對C有了不錯的理解後,看C++的《C++primer》,也是一本很經典的書目。
⑺ 嵌入式學習書籍有哪些
以下是華清遠見·星創客嵌入式精英訓練營提供的學習嵌入式必看的100本書:
001《大話數據結構》
002《鳥哥的 linux 私房菜》
003《瘋狂 android 講義》
004《第一行代碼》
005《linux 內核設計與實現》
006《驅動設計開發》
007《linux 內核解密》
008《unix 環境高級編程》
009《linux 內核設計與實現》
010《essential C++》
011《嵌入式 linux》
012《linux 設備驅動》
013《c 語言深度解剖》
014《linux 下的 c編程》
015《C Primer Plus(第五版)》
016《ARM 體系結構與編程(第二版)》
017《lINUX 設備驅動開發詳解(第三版)》
018《android 開發藝術探討》
019《c++plus》
020《Unix 環境高級編程》
021《與大數據同行——學習和教育的未來》
022《用戶體驗的要素》
023《編程與藝術》
024《ARM 嵌入式體系結構與介面技術》
025《cortex-m0 介面編程》
026《C 語言程序設計:現代方法》
027《C++ Primer》
028《數據結構》(嚴蔚敏)
029《演算法導論》
030《Linux 設備驅動開發》
031《代碼大全》
032《深入理解計算機系統》
033《UNIX 環境高級編程》
034《計算機安全原理》
035《UNIX 網路編程》
036《HeadFirst 設計模式》
037《linux 驅動》(宋保華)
038《C++ primer4》
039《qt5 精彩實例》
040《ldd3》
041《C++高級編程》
042《C語言教程》
043《實戰 linux 編程精髓》
044《ARM 教程》
045《JAVA 編程思想》
046《HTML+CSS 網頁設計與布局從入門到精通》
047《C 語言深度解剖》
048《深度實踐嵌入式 Linux 系統移植》
049《unix 高級編程》
050《c 嵌入式一站式教學》
051《編譯原理》
052《深度實踐嵌入式 Linux 系統移植》
053《UNIX 環境高級編程》
054《linux 網路編程》
055《C 語言程序設計》
056《unix 環境高級編程》
057《嵌入式 linuxc 語言程序設計基礎教程》
058《Java 編程思想》
059《TCP/IP 詳解》
060《linux 技術手冊》
061《C 語言深度剖析》
062《Unix 高級環境編程》
063《C++primerplus》
064《QT》
065《C 程序設計》
066《C 和指針》
067《C++primer》
068《C 程序設計語言》
069《ProgrammingC#》
070《thinking in C++》
071《Linux Device driver》
072《Linux kernel development》
073《軟體工程》
074《C 和指針》
075《Android 核心代碼》
076《Android 技術內幕》
077《Android 底層移植》
078《Unix 編程手冊(上下卷)》
079《Linux 驅動設計第三版》
080《ARM 實戰開發》
081《unix 環境高級編程》
082《tcp/ip 編程詳解》
083《Linux 網路編程》
084《Unix 編程藝術》
085《計算機程序的構造和解釋》
086《C Primer plus》
087《LINUX 權威指南》
088《LINUX 設備驅動程序》
089《The C Programming Language》
090《ajax 高級程序設計》
091《angula js 權威教程》
092《ARM 體系結構》
093《Unix 環境高級編程》
094《Linux 設備驅動程序》
095《現代操作系統》
096《TCP/IP 協議詳解》
097《嵌入式 C 語言設計模式》
098《Struts In Action》
099《c 程序設計語言(第二版)》
100《深入理解 Linux 內核(第三版)》
⑻ 如何學習C語言
實踐,學以致用。實踐是最好的老師,只要好好實踐體會,那麼,一定會掌握的很牢靠的
⑼ c語言中void什麼意思
1.10,void關鍵字
void有什麼好講的呢?如果你認為沒有,那就沒有;但如果你認為有,那就真的有。有點像「色即是空,空即是色」。
1.10.1,void a?
void的字面意思是「空類型」,void*則為「空類型指針」,void*可以指向任何類型的數據。void幾乎只有「注釋」和限製程序的作用,因為從來沒有人會定義一個void變數,看看下面的例子:
voida;
VisualC++6.0上,這行語句編譯時會出錯,提示「illegaluseoftype'void'」。不過,即使voida的編譯不會出錯,它也沒有任何實際意義。
void真正發揮的作用在於:
(1) 對函數返回的限定;
(2) 對函數參數的限定。
眾所周知,如果指針p1和p2的類型相同,那麼我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的數據類型,則必須使用強制類型轉換運算符把賦值運算符右邊的指針類型轉換為左邊指針的類型。
例如:
float *p1;
int *p2;
p1=p2;
其中p1=p2語句會編譯出錯,提示「'=':cannotconvertfrom'int*'to'float*'」,必須改為:
p1=(float*)p2;
而void*則不同,任何類型的指針都可以直接賦值給它,無需進行強制類型轉換:
void *p1;
int *p2;
p1=p2;
但這並不意味著,void*也可以無需強制類型轉換地賦給其它類型的指針。因為「空類型」可以包容「有類型」,而「有類型」則不能包容「空類型」。比如,我們可以說「男人和女人都是人」,但不能說「人是男人」或者「人是女人」。下面的語句編譯出錯:
void *p1;
int *p2;
p2=p1;
提示「'=':cannotconvertfrom'void*'to'int*'」。
1.10.2,void修飾函數返回值和參數
【規則1-33】如果函數沒有返回值,那麼應聲明為void類型
在C語言中,凡不加返回值類型限定的函數,就會被編譯器作為返回整型值處理。但是許多程序員卻誤以為其為void類型。例如:
add(inta,intb)
{
return a+b;
}
intmain(intargc,char*argv[])//甚至很多人以為main函數無返回值
//或是為void型的
{
printf("2+3=%d",add(2,3));
}
程序運行的結果為輸出: 2+3=5
這說明不加返回值說明的函數的確為int函數。
因此,為了避免混亂,我們在編寫C程序時,對於任何函數都必須一個不漏地指定其類型。如果函數沒有返回值,一定要聲明為void類型。這既是程序良好可讀性的需要,也是編程規范性的要求。另外,加上void類型聲明後,也可以發揮代碼的「自注釋」作用。所謂的代碼的「自注釋」即代碼能自己注釋自己。
【規則1-34】如果函數無參數,那麼應聲明其參數為void
在C++語言中聲明一個這樣的函數:
intfunction(void)
{
return1;
}
則進行下面的調用是不合法的:function(2);
因為在C++中,函數參數為void的意思是這個函數不接受任何參數。
但是在TurboC2.0中編譯:
#include"stdio.h"
fun()
{
return1;
}
main()
{
printf("%d",fun(2));
getchar();
}
編譯正確且輸出1,這說明,在C語言中,可以給無參數的函數傳送任意類型的參數,但是在C++編譯器中編譯同樣的代碼則會出錯。在C++中,不能向無參數的函數傳送任何參數,出錯提示「'fun':」。
所以,無論在C還是C++中,若函數不接受任何參數,一定要指明參數為void。1.10.3,void指針
【規則1-35】千萬小心又小心使用void指針類型。
按照ANSI()標准,不能對void指針進行演算法操作,即下列操作都是不合法的:
void*pvoid;
pvoid++;//ANSI:錯誤
pvoid+=1;//ANSI:錯誤
ANSI標准之所以這樣認定,是因為它堅持:進行演算法操作的指針必須是確定知道其指向數據類型大小的。也就是說必須知道內存目的地址的確切值。
例如:
int*pint;
pint++;//ANSI:正確
但是大名鼎鼎的GNU(GNU'sNotUnix的遞歸縮寫)則不這么認定,它指定void*的演算法操作與char*一致。因此下列語句在GNU編譯器中皆正確:
pvoid++;//GNU:正確
pvoid+=1;//GNU:正確
在實際的程序設計中,為符合ANSI標准,並提高程序的可移植性,我們可以這樣編寫實現同樣功能的代碼:
void*pvoid;
(char*)pvoid++;//ANSI:正確;GNU:正確
(char*)pvoid+=1;//ANSI:錯誤;GNU:正確
GNU和ANSI還有一些區別,總體而言,GNU較ANSI更「開放」,提供了對更多語法的支持。但是我們在真實設計時,還是應該盡可能地符合ANSI標准。
【規則1-36】如果函數的參數可以是任意類型指針,那麼應聲明其參數為void*。
典型的如內存操作函數memcpy和memset的函數原型分別為:
void*memcpy(void*dest,constvoid*src,size_tlen);
void*memset(void*buffer,intc,size_tnum);
這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實地體現了內存操作函數的意義,因為它操作的對象僅僅是一片內存,而不論這片內存是什麼類型。如果memcpy和memset的參數類型不是void*,而是char*,那才叫真的奇怪了!這樣的memcpy和memset明顯不是一個「純粹的,脫離低級趣味的」函數!
下面的代碼執行正確:
例子:memset接受任意類型指針
intIntArray_a[100];
memset(IntArray_a,0,100*sizeof(int));//將IntArray_a清0
例子:memcpy接受任意類型指針
intdestIntArray_a[100],srcintarray_a[100];
//將srcintarray_a拷貝給destIntArray_a
memcpy(destIntArray_a,srcintarray_a,100*sizeof(int));
有趣的是,memcpy和memset函數返回的也是void*類型,標准庫函數的編寫者都不是一般人。
1.10.4,void不能代表一個真實的變數
【規則1-37】void不能代表一個真實的變數。
因為定義變數時必須分配內存空間,定義void類型變數,編譯器到底分配多大的內存呢。
下面代碼都企圖讓void代表一個真實的變數,因此都是錯誤的代碼:
voida;//錯誤
function(voida);//錯誤
void體現了一種抽象,這個世界上的變數都是「有類型」的,譬如一個人不是男人就是女人(人妖不算)。
void的出現只是為了一種抽象的需要,如果你正確地理解了面向對象中「抽象基類」的概念,也很容易理解void數據類型。正如不能給抽象基類定義一個實例,我們也不能定義一個void(讓我們類比的稱void為「抽象數據類型」)變數。
void簡單吧?到底是「色」還是「空」呢?
<<<<<<<<<<<<<,,,復制《C語言深度解剖》上的 >>>>>>>>>>>>>>>>>>>