c語言簡例教程,c語言實用教程

本文目錄一覽:

c語言編程怎樣入門

任何知識的學習沒有太多捷徑,但有經驗、方法及教訓

(1)基礎教材選擇-系統又通俗易懂,最好有該書配套免費視頻

建議選擇系統正統的大學教材,盡量不要選擇“多少天精通C語言”等吸引眼球的教程,相信一點C語言學習沒有速成。這裡給大家推薦一本不錯的入門教程:清華大學出版社-孫海洋-C語言程序設計,講解很透徹、知識點很全面、例程較多且通俗易懂。優酷“孫海洋課題”還有全書免費教學視頻,便於自學。

(2)動起手來–立馬安裝VC++6.0或VS開發環境

C語言是特別注重動手實操能力的課程!!動起手來,現在開始安裝VC++6.0開發環境,從第一個經典程序“Hello,world!”開始,每一個例題及知識點均通過開發環境驗證、理解深化。多做每一章小型實驗操作(網上多得很)。提升代碼調試能力。

(3)有了基礎後,一般可以有兩個發展方向可供選擇

(i)轉向項目實戰

建議購買一本C語言項目教程,在實踐項目中強化理論知識的學習。

(ii)繼續深入理論學習

建議購買國外經典深入學習C語言的教程,人民郵電出版社-C Primer Plus(第5版),或者 機械工業出版社-C程序設計語言(第2版.新版)   

下定信心,堅持下去!希望對你有所幫助。

下面是轉載的 孫海洋 版 C語言程序設計 部分內容截圖。

求C語言教程

我給你電子文檔筆記吧~~

複製來的….

第一章 概述

1. C語言的特點

①語言簡潔、緊湊,使用方便、靈活。共有32個關鍵字,9種控制語句。

②運算符豐富,公有34種運算符。

③數據結構豐富,數據類型有:整型、實型、字符型、數組、指針、結構體、共用體等。

④具有結構化的控制語句(如if…else、while、do…while、switch、for)

⑤語法限制不太嚴格,程序設計自由度大。

⑥允許直接訪問物理地址,能進行位(bit)操作,可以直接對硬件操作。

⑦生成目標代碼質量高,程序執行效率高。

⑧可移植性好。

2. C語言的用途

C雖不擅長科學計算和管理領域,但對操作系統和系統實用程序以及對硬件進行操作方面,C有明顯的優勢。現在很多大型應用軟件也用C編寫。

Top of Page

第二章 數據類型、運算符與表達式

1. C的數據類型

C的數據類型包括:整型、字符型、實型或浮點型(單精度和雙精度)、枚舉類型、數組類型、結構體類型、共用體類型、指針類型和空類型。

2. 常量與變量

常量其值不可改變,符號常量名通常用大寫。變量其值可以改變,變量名只能由字母、數字和下劃線組成,且第一個字符必須為字母或下劃線。否則為不合法的變量名。變量在編譯時為其分配相應存儲單元。

3. 整型數據

整型常量的表示方法:十進制不用說了,八進制以0開頭,如0123,十六進制以0x開頭,如0x1e。

整型變量分為:基本型(int)、短整型(short int)、長整型(long int)和無符號型。不同機器上各類數據所佔內存字節數不同,一般int型為2個字節,long型為4個字節。

4. 實型數據

實型常量表示形式:十進制形式由數字和小數點組成(必須有小數點),如:0.12、.123、123

0.0等。指數形式如123e3代表123×10的三次方。

實型變量分為單精度(float)和雙精度(double)兩類。在一般系統中float型佔4字節,7位有效數字,double型佔8字節,15~16位有效數字。

5. 字符型數據

字符變量用單引號括起來,如’a’,’b’等。還有一些是特殊的字符常量,如’\n’,’\t’等。分別代表換行和橫向跳格。

字符變量以char 來定義,一個變量只能存放一個字符常量。

字符串常量是由雙引號括起來的字符序列。這裡一定要注意’a’和”a”的不同,前者為字符常量,後者為字符串常量,c規定:每個字符串的結尾加一個結束標誌”,實際上”a”包含兩個字符:’a’和”。

6. 數值型數據間的混合運算

整型、字符型、實型數據間可以混合運算,運算時不同類型數據要轉換成同一類型再運算,轉換規則:

char,short – int – unsigned – long – double – float

7. 運算符和表達式

c運算符包括:

算數運算符( + – * / % )

關係運算符( == = = != )

邏輯運算符( ! || )

位運算符( ~ | ^ )

賦值運算符( = )

條件運算符( ? : )

逗號運算符( , )

指針運算符( * )

求字節數( sizeof )

強制類型轉換(類型)

分量運算符( . – )

下標運算符( [ ] )

其它運算符( 如函數調用運算符( ) )

自增自減運算符( ++ — )注意:++i和i++的不同之處,++i使用i之前先使i加1,i++使用i之後,使i加1。

逗號表達式的求解過程:先求解表達式1,再求解表達式2,整個表達式的值是表達式2的值。

Top of Page

第三章 最簡單的c程序設計

1.c的9種控制語句:

if() ~ else~

for()~

while()~

do~while()

continue

break

switch

goto

return

程序的三種基本結構:順序結構,選擇結構,循環結構

2.數據輸出

c語言不提供輸入輸出語句,輸入輸出操作是由c的庫函數完成。但要包含頭文件stdio.h。

putchar( ) 向終端輸出一個字符

printf( )的格式字符:

① d格式符 用來輸出十進制整數

%d 按整型數據的實際長度輸出

%md 使輸出長度為m,如果數據長度小於m,則左補空格,如果大於m,則輸出實際長度

%ld 輸出長整型數據

② o格式符 以八進制形式輸出整數

③ x格式符 以十六進制形式輸出整數

④ u格式符 用來輸出unsigned型數據,以十進制形式輸出

⑤ c格式符 用來輸出一個字符

⑥ s格式符 輸出一個字符串

%s 輸出實際長度字符串

%ms 輸出的串佔m列,如果串長度小於m,左補空格,如果大於m,實際輸出

%-ms輸出的串佔m列,如果串長度小於m,右補空格,

%m.ns 輸出佔m列,但只取字符串中左端n個字符並靠右對齊

%-m.ns m、n含義同上,靠左對齊,如果nm,則m自動取n值

⑦ f格式符 以小數形式輸出實數

%f 整數部分全部輸出,小數部分輸出6位

%m.nf 輸出數據共佔m列,其中有n位小數。如果數值長度小於m,左補空格

%-m.nf 同上,右補空格

⑧ e格式符 以指數形式輸出實數

%e 系統指定6位小數,5位指數(e+002 )

⑨ g格式符 輸出實數,根據數值大小,自動選f格式或e格式

3.數據輸入

getchar( ) 從終端輸入一個字符

scanf( 格式控制,地址列表) 標準C scanf中不使用%u,對於unsigned型數據,以%d或%o或%x輸入。%後的*,用來跳過它相應的數據。輸入數據時不能規定精度如scanf( “%7.2f”, a );是不合法的。

Top of Page

第四章 邏輯運算和判斷選取控制

1. 關係運算符:

c提供6種關係運算符( = = == != )前四種優先級高於後兩種。

2. If語句

C提供了三種形式的if語句

If(表達式) 語句

If(表達式) 語句1 else 語句2

If(表達式1) 語句1

Else if(表達式2) 語句2

else 語句n

3. 條件運算符

(ab)?a:b 條件為真,表達式取值a,否則取值b

4. Switch語句

Switch(表達式)

{

case 常量表達式1:語句1; break;

case 常量表達式2:語句2; break;

case 常量表達式n:語句n; break;

default :語句n+1;

}

Top of Page

第五章 循環控制

1. 幾種循環語句

goto語句(現已很少使用)

while語句 先判斷表達式後執行語句

do-while語句 先執行語句後判斷表達式

for語句

2. Break語句和continue語句

Break語句用於跳出循環,continue用於結束本次循環。

Top of Page

第六章 數組

1. 一維數組

c規定只有靜態存儲(static)和外部存儲(extern)數組才能初始化。給數組初始化時可以不指定數組長度。

2. 二維數組

3. 字符數組

部分字符串處理函數

puts(字符數組) 將一個字符串輸出到終端。

gets(字符數組) 從終端輸入一個字符串到字符數組,並且得到一個函數值,為該字符數組的首地址

strcat(字符數組1,字符數組2) 連接兩個字符數組中的字符串,數組1必須足夠大。

Strcpy(字符數組1,字符串2) 將字符串2拷貝到字符數組1中。

Strcmp(字符串1,字符串2) 比較字符串,相等返回0,字符串1字符串2,返回正數,小於返回負數。

Strlen(字符數組) 求字符串長度。

Strlwr( 字符串) 將字符串中的大寫字母轉換成小寫

Strupr( 字符串) 將字符串中的小寫字母轉換成大寫

以上是一些比較常用的字符串處理函數。

Top of Page

第七章 函數

1. 關於形參和實參的說明

① 在函數被調用之前,形參不佔內存

② 實參可以是常量、變量或表達式

③ 必須指定形參的類型

④ 實參與形參類型應一致

⑤ 實參對形參的數據傳遞是”值傳遞”,即單向傳遞

2. 函數返回值

如果想讓函數返回一個值,在函數中就要用return語句來獲得,在定義函數時也要對函數值指定類型,如果不指定,默認返回整型。

3. 函數調用

1)注意在函數調用時實參和形參的個數、類型應一一對應。對實參表求值的順序是不確定的,有的系統按自左至右,有的系統則按自右至左的順序。這一點要注意。

2)函數調用的方式:函數語句,函數表達式,函數參數

3)如果主調函數和被調函數在同一文件中,並且主調函數在前,那麼一般要在主調函數中對被調函數進行說明。除非:(1)被調函數的返回值類型為整型或字符型(2)被調函數出現在主調函數之前。

4)對函數的說明和定義是不同的,定義是指對函數功能的確立,包括指定函數名,函數值類型,形參及其類型、函數體等。說明則只是對已定義的函數返回值類型進行說明,只包括函數名、函數類型以及一個空的括弧,不包括形參和函數體。

5)c語言允許函數的遞歸調用(在調用一個函數的過程中又出現直接或間接的調用該函數本身)。

4. 數組作為函數參數

1)數組元素作為函數參數 和一般變量相同

2)數組名作參數應該在主調和被調函數分別定義數組,形參數組的大小可以不定義。注意:數組名作參數,不是單向傳遞。

3)多維數組作參數,在被調函數中對形參數組定義時可以省略第一維的大小說明,但不能省略第二維或更高維的說明。

5. 局部變量和全局變量

從變量作用域角度分,變量可分為局部變量和全局變量。

1)內部變量(局部變量)

在一個函數內定義,只在函數範圍內有效的變量。

2)外部變量(全局變量)

在函數外定義,可以為本文件其它函數所共用,有效範圍從定義變量的位置開始

到本文件結束。建議盡量少使用全局變量,因為它在程序全部執行過程中都佔用

資源,而且使函數的通用性降低了。如果在定義外部變量之前的函數要想使用該

外部變量,則應在該函數中用extern作外部變量說明。

6. 動態存儲變量與靜態存儲變量

從變量值存在的時間(生存期)角度來分,可分為靜態存儲變量和動態存儲變量。靜態存儲指在程序運行期間給變量分配固定的存儲空間,動態存儲指程序運行期間根據需要動態的給變量分配存儲空間。

C語言中,變量的存儲方法分為兩大類:靜態存儲類和動態存儲類,具體包括:自動的(auto),靜態的(static),寄存器的(register),外部的(extern)。

1) 局部變量的存儲方式

函數中的局部變量如不作專門說明,都之auto的,即動態存儲的,auto可以省略。局部變量也可以定義為static的,這時它在函數內值是不變的。靜態局部變量如不賦初值,編譯時系統自動賦值為0,動態局部變量如不賦初值,則它的值是個不確定的值。C規定,只有在定義全局變量和局部靜態變量時才能對數組賦初值。為提高執行效率,c允許將局部變量值放在寄存器中,這種變量叫register變量,要用register說明。但只有局部動態變量和形式參數可以作為register變量,其它不行。

2) 全局變量的存儲方式

全局變量在函數外部定義,編譯時分配在靜態存儲區,可以在程序中各個函數所引用。多個文件的情況如何引用全局變量呢?假如在一個文件定義全局變量,在別的文件引用,就要在此文件中用extern對全局變量說明,但如果全局變量定義時用static的話,此全局變量就只能在本文件中引用了,而不能被其它文件引用。

3) 存儲類別小結

從作用域角度分,有局部變量和全局變量

局部變量:自動變量,即動態局部變量(離開函數,值就消失)

靜態局部變量(離開函數,值仍保留)

寄存器變量(離開函數,值就消失)

(形參可定義為自動變量和寄存器變量)

全局變量:靜態全局變量(只限本文件引用)

全局變量(允許其它文件引用)

從存在的時間分,有靜態存儲和動態存儲

動態存儲:自動變量(本函數內有效)

寄存器變量(本函數內有效)

形參

靜態存儲:靜態局部變量(函數內有效)

靜態全局變量(本文件內有效)

全局變量(其它文件可引用)

從變量值存放的位置分

靜態存儲區:靜態局部變量

靜態全局變量

全局變量

動態存儲區:自動變量和形參

寄存器內:寄存器變量

7. 內部函數和外部函數

內部函數:只能被本文件中的其它函數調用,定義時前加static,內部函數又稱靜態函數。

外部函數:可以被其它文件調用,定義時前加extern,如果省略,則隱含為外部函數,在需要調用此函數的文件中,一般要用extern說明。

Top of Page

第八章 預編譯處理

c編譯系統在對程序進行通常的編譯之前,先進行預處理。c提供的預處理功能主要有以下三種:1)宏定義 2)文件包含 3)條件編譯

1. 宏定義

不帶參數的宏定義

用一個指定的標識符來代表一個字符串,形式:#define 標識符 字符串

幾點說明:

1) 宏名一般用大寫

2) 宏定義不作語法檢查,只有在編譯被宏展開後的源程序時才會報錯

3) 宏定義不是c語句,不在行末加分號

4) 宏名有效範圍為定義到本源文件結束

5) 可以用#undef命令終止宏定義的作用域

6) 在宏定義時,可以引用已定義的宏名

帶參數的宏定義

定義形式:#define 宏名(參數表) 字符串

這和函數有些類似,但他們是不同的:

1) 函數調用時,先求實參表達式值,再代入形參,而宏只是簡單替換,並不求值

2) 函數調用是在程序運行時分配內存的,而宏展開時並不分配內存,也沒有返回值的概念

3) 對函數中的實參和形參都要定義類型,而且要求一致,宏名無類型,其參數也沒有類型。

4) 函數只有一個返回值,而宏可以得到幾個結果

5) 宏替換不佔運行時間,只佔編譯時間,而函數調用占運行時間

2. 文件包含處理

#include “文件1” 就是將文件1的全部內容複製插入到#include位置,作為一個源文件進行編譯。

在#include命令中,文件名可以用” “也可以用 ,假如現在file1.c中包含file2.h文件,” “表示系統先在file1.c所在目錄中找file2.h,如果找不到,再按系統指定的標準方式檢索目錄, 表示系統直接按指定的標準方式檢索目錄。所以用” “保險一點。

3. 條件編譯

條件編譯指不對整個程序都編譯,而是編譯滿足條件的那部分。條件編譯有以下幾種形式:

1)#ifdef 標識符

程序段1

#else

程序段2

#endif

它的作用:當標識符在前面已經被定義過(一般用#define),則對程序段1編譯,否則對程序段2編譯。

2)#ifndef 標識符

程序段1

#else

程序段2

#endif

它的作用和#ifdef相反,當標識符沒被定義過,對程序段1編譯,否則對程序段2編譯。

3)#if 表達式

程序段1

#else

程序段2

#endif

它的作用:當表達式值為真(非0)時,對程序段1編譯,否則對程序段2編譯。

Top of Page

第九章 指針

指針說白了就是地址。指針變量就是用來存放指針(地址)的變量。

1. 變量的指針和指向變量的指針變量

讀起來很拗口,說白了就是變量的地址和用來存放變量地址的地址變量。因為一個變量在編譯的時候系統要為它分配一個地址,假如再用一個變量來存放這個地址,那麼這個變量就叫做指向變量的指針變量,也就是用來存放變量地址的這麼一個變量。所謂”指向”就是指存放××的地址,如指向變量的指針變量,”指向”就是指用來存放變量的地址,再如指向數組的指針變量,”指向”就是指存放數組的地址。只要理解了這個,指針也就不難了。另外,還有指向字符串的指針變量,指向函數的指針變量,指向指針的指針變量等。

1) 指針變量的定義

形式:類型標識符 *標識符 如:int *pointer;

要注意兩點:*表示pointer是個指針變量,在用這個變量的時候不能寫成*pointer, *pointer是pointer指向的變量。一個指針變量只能指向同一個類型的變量。如上面

pointer只能指向int型變量。

2)指針變量的引用

兩個有關的運算符:

取地址運算符 a 就代表變量a的地址

* 指針運算符 *a 就代表變量a的值

2. 數組的指針和指向數組的指針變量

數組的指針指數組的起始地址,數組元素的指針指數組元素的地址。

1)指向數組元素的指針變量的定義與賦值

定義和指向變量的指針變量定義相同,c規定數組名代表數組的首地址,即第一個數組元素地址。

2)通過指針引用數組元素

我們通常引用數組元素的形式是a[i],如果用指針可以這樣引用,*(a+i),或定義一個指針變量p,將數組a的首地址賦給p,p=a;然後用*(p+i)引用。

注意:指針變量p指向數組a首地址,則p++指向數組a的下一元素地址,即a[1]的地址。

3)數組名作函數參數

形參數組和實參數組之間並不是值傳遞,而是共用同一段地址,所以在函數調用過程中如果形參的值發生變化,則實參的值也跟着變化。

4)指向多維數組的指針和指針變量

以二維數組為居多。假設定義了一個二維數組a[3][4],那麼

a代表整個二維數組的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。

假設a是一個數組的首地址,那麼如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則a+I代表第I行的首地址。

那麼第一行第二列的元素地址如何表示呢?a[1]+2或a[1][2]或*(a+1)+2。

我們只要記住:在二維數組中a代表整個數組的首地址,a[I]代表第I行的首地址,a[I]與*(a+I)等價就行了。只要運用熟練了就沒什麼複雜的了。

5)指向由m個整數組成的一維數組的指針變量

如:int (*p)[4],p是一個指向包含4個元素的一維數組,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維數組的長度為單位的,這裡是4,舉個例子:

假設a[3][4]=,p先指向a[0]也就是數組a的首地址,那麼p+1就是a[1]的首地址即元素9的地址,因為在定義p時int (*p)[4],定義一維數組長度為4,所以p+1就等於加了一個一維數組的長度4。

3. 字符串的指針和指向字符串的指針變量

1)字符串的表示形式

c中字符串有兩種表示形式:一種是數組,一種是字符指針

char string[]=”I love c!”;

char *str=”I love c!”;

其實指針形式也是在內存中開闢了一個數組,只不過數組的首地址存放在字符指針變量str中,千萬不要認為str是一個字符串變量。

2)字符串指針作函數參數

實際上字符串指針就是數組的首地址。

3)字符指針變量與字符數組的區別

① 字符數組由若干元素組成,每個元素存放一個字符,而字符指針變量只存放字符串的首地址,不是整個字符串

② 對數組初始化要用static,對指針變量不用。

③ 對字符數組賦值,只能對各個元素賦值,不能象下面這樣:

char str[14];

str=”I love c!”;

對指針變量可以,

char *str;

str=”I love c!”;

注意:此時賦給str的不是字符,而是字符串首地址。

④ 數組在定義和編譯時分配內存單元,而指針變量定義後最好將其初始化,否則指針變量的值會指向一個不確定的數.

嘎嘎。。。就這麼多啦~~

最簡單的C語言代碼

最簡單的C語言代就是輸出“helloWord”,通常是作為初學編程語言時的第一個程序代碼。具體代碼如下:

#include stdio.h

int main(){

  printf(“Hello, World! \n”);

  return 0;

}

擴展資料:

1、程序的第一行#include stdio.h是預處理器指令,告訴 C 編譯器在實際編譯之前要包含 stdio.h 文件。

2、下一行intmain()是主函數,程序從這裡開始執行。

3、下一行printf(...)是C中另一個可用的函數,會在屏幕上顯示消息"Hello,World!"。

4、下一行return0;終止main()函數,並返回值0。

參考資料來源:百度百科-c語言

怎麼自學C語言 入門

在開始學習C語言基礎時,要反問自己為什麼學C語言,如何學好C語言。同時要知道什麼是C語言以及C語言的發展。

當對這些知識有了一個概念之後,就正式開始學習C語言了,其中,可能會學到數據類型、運算符、表達式、數組、/函等,這些是為了對C語言的基礎有一個基礎認知,擴展,整合;還會學到指針、聯合體、結構體、枚舉、位運算、預處理、文件等知識點,學這些是為了全面掌握面向過程設計、實練邏輯算法,拓展思維模式等過程。

學完了這些,還可能會講到VS、VC++、C++、C和TC—認識開發環境和語言的區別。

這裡只給大家介紹一個大概,如果有興趣的話,可以和我私聊哦

第二階段:上機實戰訓練

學完了這些理論知識後,就得將學到的知識點全部運用到實踐中去。這樣才能更好學習入門。分享不錯裙的有軟件視頻資料分享

1、C++語言熟練,熟悉C++語法,包括面向對象的概念,模版等

這一階段需要比較艱辛的過程,需要學習很多書,包括《C++ Programming Language》,《Effective C++》,《More Effective C++》,《Thinking in C++》,《C++對象模型》,《C++ 模版》,如果上述書籍已經很熟悉了,本人認為,在學習階段,已經很不錯了。該過程可以在大學完成,需要一到兩年的時間,應為是純理論的東西,只能算熟悉。在該過程中,需要做一些簡單的程序。

2、C++做項目,使用C++做項目,需要比較多的其它庫,比如UI庫,還需要使用一些網絡庫等,這個時候,就可以看到C++的博大精深了,此時,光有C++語言知識是不夠的,需要補充一些平台開發的知識,看看開源的C++項目。比如:Windows程序設計,C++網絡編程,DirectX遊戲開發,如果用C++做了兩個以上的項目,那以及很不錯了。

3、最高境界是精通,自然是量的積累才會有質地變化。

c語言指針簡單教程

指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; 能很方便地使用數組和字符串; 並能象彙編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環, 能否正確理解和使用指針是我們是否掌握C語言的一個標誌。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。

指針的基本概念 在計算機中,所有的數據都是存放在存儲器中的。 一般把存儲器中的一個字節稱為一個內存單元, 不同的數據類型所佔用的內存單元數不等,如整型量佔2個單元,字符量佔1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據一個內存單元的編號即可準確地找到該內存單元。內存單元的編號也叫做地址。 既然根據內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關係。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這裡,帳號就是存單的指針, 存款數是存單的內容。對於一個內存單元來說,單元的地址即為指針, 其中存放的數據才是該單元的內容。在C語言中, 允許用一個變量來存放指針,這種變量稱為指針變量。因此, 一個指針變量的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字符變量C,其內容為“K”(ASCII碼為十進制數 75),C佔用了011A號單元(地址用十六進數表示)。設有指針變量P,內容為011A, 這種情況我們稱為P指向變量C,或說P是指向變量C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變。 但在常把指針變量簡稱為指針。為了避免混淆,我們中約定:“指針”是指地址, 是常量,“指針變量”是指取值為地址的變量。 定義指針的目的是為了通過指針去訪問內存單元。

 

既然指針變量的值是一個地址, 那麼這個地址不僅可以是變量的地址, 也可以是其它數據結構的地址。在一個指針變量中存放一

個數組或一個函數的首地址有何意義呢? 因為數組或函數都是連續存放的。通過訪問指針變量取得了數組或函數的首地址, 也就找到了該數組或函數。這樣一來, 凡是出現數組,函數的地方都可以用一個指針變量來表示, 只要該指針變量中賦予數組或函數的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數據類型或數據結構往往都佔有一組連續的內存單元。 用“地址”這個概念並不能很好地描述一種數據類型或數據結構, 而“指針”雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是“指向”一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入“指針”概念的一個重要原因。

指針變量的類型說明

對指針變量的類型說明包括三個內容:

(1)指針類型說明,即定義變量為一個指針變量;

(2)指針變量名;

(3)變量值(指針)所指向的變量的數據類型。

其一般形式為: 類型說明符 *變量名;

其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數據類型。

例如: int *p1;表示p1是一個指針變量,它的值是某個整型變量的地址。 或者說p1指向一個整型變量。至於p1究竟指向哪一個整型變量, 應由向p1賦予的地址來決定。

再如:

staic int *p2; /*p2是指向靜態整型變量的指針變量*/

float *p3; /*p3是指向浮點變量的指針變量*/

char *p4; /*p4是指向字符變量的指針變量*/ 應該注意的是,一個指針變量只能指向同類型的變量,如P3 只能指向浮點變量,不能時而指向一個浮點變量, 時而又指向一個字符變量。

指針變量的賦值

指針變量同普通變量一樣,使用之前不僅要定義說明, 而且必須賦予具體的值。未經賦值的指針變量不能使用, 否則將造成系統混亂,甚至死機。指針變量的賦值只能賦予地址, 決不能賦予任何其它數據,否則將引起錯誤。在C語言中, 變量的地址是由編譯系統分配的,對用戶完全透明,用戶不知道變量的具體地址。 C語言中提供了地址運算符來表示變量的地址。其一般形式為: 變量名; 如a變示變量a的地址,b表示變量b的地址。 變量本身必須預先說明。設有指向整型變量的指針變量p,如要把整型變量a 的地址賦予p可以有以下兩種方式:

(1)指針變量初始化的方法 int a;

int *p=a;

(2)賦值語句的方法 int a;

int *p;

p=a;

不允許把一個數賦予指針變量,故下面的賦值是錯誤的: int *p;p=1000; 被賦值的指針變量前不能再加“*”說明符,如寫為*p=a 也是錯誤的

指針變量的運算

指針變量可以進行某些運算,但其運算的種類是有限的。 它只能進行賦值運算和部分算術運算及關係運算。

1.指針運算符

(1)取地址運算符

取地址運算符是單目運算符,其結合性為自右至左,其功能是取變量的地址。在scanf函數及前面介紹指針變量賦值中,我們已經了解並使用了運算符。

(2)取內容運算符*

取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之後跟的變量必須是指針變量。需要注意的是指針運算符*和指針變量說明中的指針說明符* 不是一回事。在指針變量說明中,“*”是類型說明符,表示其後的變量是指針類型。而表達式中出現的“*”則是一個運算符用以表示指針變量所指的變量。

main(){

int a=5,*p=a;

printf (“%d”,*p);

}

……

表示指針變量p取得了整型變量a的地址。本語句表示輸出變量a的值。

2.指針變量的運算

(1)賦值運算

指針變量的賦值運算有以下幾種形式:

①指針變量初始化賦值,前面已作介紹。

②把一個變量的地址賦予指向相同數據類型的指針變量。例如:

int a,*pa;

pa=a; /*把整型變量a的地址賦予整型指針變量pa*/

③把一個指針變量的值賦予指向相同類型變量的另一個指針變量。如:

int a,*pa=a,*pb;

pb=pa; /*把a的地址賦予指針變量pb*/

由於pa,pb均為指向整型變量的指針變量,因此可以相互賦值。

④把數組的首地址賦予指向數組的指針變量。

例如: int a[5],*pa;

pa=a; (數組名表示數組的首地址,故可賦予指向數組的指針變量pa)

也可寫為:

pa=a[0]; /*數組第一個元素的地址也是整個數組的首地址,

也可賦予pa*/

當然也可採取初始化賦值的方法:

int a[5],*pa=a;

⑤把字符串的首地址賦予指向字符類型的指針變量。例如: char *pc;pc=”c language”;或用初始化賦值的方法寫為: char *pc=”C Language”; 這裡應說明的是並不是把整個字符串裝入指針變量, 而是把存放該字符串的字符數組的首地址裝入指針變量。 在後面還將詳細介紹。

⑥把函數的入口地址賦予指向函數的指針變量。例如: int (*pf)();pf=f; /*f為函數名*/

(2)加減算術運算

對於指向數組的指針變量,可以加上或減去一個整數n。設pa是指向數組a的指針變量,則pa+n,pa-n,pa++,++pa,pa–,–pa 運算都是合法的。指針變量加或減一個整數n的意義是把指針指向的當前位置(指向某數組元素)向前或向後移動n個位置。應該注意,數組指針變量向前或向後移動一個位置和地址加1或減1 在概念上是不同的。因為數組可以有不同的類型, 各種類型的數組元素所佔的字節長度是不同的。如指針變量加1,即向後移動1 個位置表示指針變量指向下一個數據元素的首地址。而不是在原地址基礎上加1。

例如:

int a[5],*pa;

pa=a; /*pa指向數組a,也是指向a[0]*/

pa=pa+2; /*pa指向a[2],即pa的值為pa[2]*/ 指針變量的加減運算只能對數組指針變量進行, 對指向其它類型變量的指針變量作加減運算是毫無意義的。(3)兩個指針變量之間的運算只有指向同一數組的兩個指針變量之間才能進行運算, 否則運算毫無意義。

①兩指針變量相減

兩指針變量相減所得之差是兩個指針所指數組元素之間相差的元素個數。實際上是兩個指針值(地址) 相減之差再除以該數組元素的長度(字節數)。例如pf1和pf2 是指向同一浮點數組的兩個指針變量,設pf1的值為2010H,pf2的值為2000H,而浮點數組每個元素佔4個字節,所以pf1-pf2的結果為(2000H-2010H)/4=4,表示pf1和 pf2之間相差4個元素。兩個指針變量不能進行加法運算。 例如, pf1+pf2是什麼意思呢?毫無實際意義。

②兩指針變量進行關係運算

指向同一數組的兩指針變量進行關係運算可表示它們所指數組元素之間的關係。例如:

pf1==pf2表示pf1和pf2指向同一數組元素

pf1pf2表示pf1處於高地址位置

pf1pf2表示pf2處於低地址位置

main(){

int a=10,b=20,s,t,*pa,*pb;

pa=a;

pb=b;

s=*pa+*pb;

t=*pa**pb;

printf(“a=%d\nb=%d\na+b=%d\na*b=%d\n”,a,b,a+b,a*b);

printf(“s=%d\nt=%d\n”,s,t);

}

……

說明pa,pb為整型指針變量

給指針變量pa賦值,pa指向變量a。

給指針變量pb賦值,pb指向變量b。

本行的意義是求a+b之和,(*pa就是a,*pb就是b)。

本行是求a*b之積。

輸出結果。

輸出結果。

……

指針變量還可以與0比較。設p為指針變量,則p==0表明p是空指針,它不指向任何變量;p!=0表示p不是空指針。空指針是由對指針變量賦予0值而得到的。例如: #define NULL 0 int *p=NULL; 對指針變量賦0值和不賦值是不同的。指針變量未賦值時,可以是任意值,是不能使用的。否則將造成意外錯誤。而指針變量賦0值後,則可以使用,只是它不指向具體的變量而已。

main(){

int a,b,c,*pmax,*pmin;

printf(“input three numbers:\n”);

scanf(“%d%d%d”,a,b,c);

if(ab){

pmax=a;

pmin=b;}

else{

pmax=b;

pmin=a;}

if(c*pmax) pmax=c;

if(c*pmin) pmin=c;

printf(“max=%d\nmin=%d\n”,*pmax,*pmin);

}

……

pmax,pmin為整型指針變量。

輸入提示。

輸入三個數字。

如果第一個數字大於第二個數字...

指針變量賦值

指針變量賦值

指針變量賦值

指針變量賦值

判斷並賦值

判斷並賦值

輸出結果

……

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/182450.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 06:21
下一篇 2024-11-24 06:21

相關推薦

  • MQTT使用教程

    MQTT是一種輕量級的消息傳輸協議,適用於物聯網領域中的設備與雲端、設備與設備之間的數據傳輸。本文將介紹使用MQTT實現設備與雲端數據傳輸的方法和注意事項。 一、準備工作 在使用M…

    編程 2025-04-29
  • Python3.6.5下載安裝教程

    Python是一種面向對象、解釋型計算機程序語言。它是一門動態語言,因為它不會對程序員提前聲明變量類型,而是在變量第一次賦值時自動識別該變量的類型。 Python3.6.5是Pyt…

    編程 2025-04-29
  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬盤。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Qt雷達探測教程

    本文主要介紹如何使用Qt開發雷達探測程序,並展示一個簡單的雷達探測示例。 一、環境準備 在開始本教程之前,需要確保你的開發環境已經安裝Qt和Qt Creator。如果沒有安裝,可以…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 猿編程python免費全套教程400集

    想要學習Python編程嗎?猿編程python免費全套教程400集是一個不錯的選擇!下面我們來詳細了解一下這個教程。 一、課程內容 猿編程python免費全套教程400集包含了從P…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29

發表回復

登錄後才能評論