c語言指針范例6篇

前言:中文期刊網精心挑選了c語言指針范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。

c語言指針

c語言指針范文1

實驗五 指針

一、 實驗目的

1、掌握指針的概念、會定義和使用指針變量

2、掌握指向數組的指針變量

3、掌握字符串指針的使用

二、 實驗內容

1、 輸入3個字符串,按由小到大的順序輸出。(習題10.2)

2、 寫一函數,求一個字符串的長度。在main函數中輸入字符串,并輸出其長度。(習題10.6)

3、 完善程序,要求使用函數功能:將一個數字字符串轉換成一個整數(不得調用C語言提供的將字符串轉換為整數的函數)。例如,若輸入字符串“-1234”,則函數把它轉換為整數值-1234。

#include

#include

long fun(char *p)

{

填寫程序

}

void main()

{

char s[6];

long n;

printf("Enter a string:n");

gets(s);

n=fun(s);

printf("%ldn",n);

}

一、 三、 實驗步驟與過程

c語言指針范文2

關鍵詞:C語言;指針;程序設計;變量;標識符

C語言在處理變量、數組、函數時,需要由操作系統把這些數據調入內存的不同存儲單元中,每個內存單元都對應著一個地址,計算機就是通過訪問這個地址來存取對應單元的內容。C語言中的每種數據類型在內存中存放所占用的存儲單元數是固定的。從而根據數據的第一個存儲單元地址(首地址)及數據類型,計算機就可以訪問這個數據。C語言聲明一個變量即表示在計算機中為該變量開辟一塊內存空間,變量的值即該內存中所保存的值,可以使用變量名對該內存的內容進行訪問或修改,或者通過先求出該變量所占內存的地址,然后直接對該內存進行訪問或修改。變量對應的首地址稱作變量的指針,指針變量是用于存放某一類型變量地址的變量,其值為所指向變量的內存地址。

指針變量的聲明規則為:類型標識符*標識符,其中“類型標識符”表示該指針變量所指向的變量的類型,標識符是該指針變量的名字。例如:

int i=1;

int *p=&i;

那么此時p為一個指向int類型的指針,其值為變量i所占內存的地址,而*p即為該內存所保留的的數值1,其中運算符&是在執行取地址操作,就是說&i表示的是i的地址,而不是i的數值,同時也可以通過對指針變量p的操作來對i的值進行訪問和修改。需要注意的是,與一般變量一樣,對于外部或者靜態指針變量,若在定義中未進行初始化,指針變量將自動被初始化為NULL,即為空指針。那么下面簡單介紹一些關于指針的應用:

正確使用指針變量可以提升程序的執行效率

正確使用指針變量可以編寫高質量、高效率的C程序。以下從數組元素的引用、函數調用的代價和因為錯誤使用指針而造成的問題三方面進行分析, 以更清晰地介紹使用指針變量對C程序運行效率的影響。

數組元素的引用

#include ""stdio.h""

main()

{

int a[5]={1,2,3,4,5},i,*p;

for (i=0;i

printf(""%d "", a[i]);

for (p=a;p

printf(""%d "",*p);

}

在該程序中,對數組元素的引用采用了兩種方法:下標法和指針法。采用下標法時,C編譯系統是將數組元素a[i]處理成*(a+i),即按數組首地址加上相對位移量得到要找的元素的地址,然后找出該單元中的內容。而采用指針法是用指針變量直接指向元素,不必每次都重新計算地址。所以指針法的執行效率要比下標法的高很多。

函數調用的代價

#include ""stdio.h""

struct s

{

int num; char name[10]; float score;

}

f(struct s *p)

{

int i;

float sum=0,ave;

for(i=0;i

sum=sum+p->score;

ave=sum/5;

printf(""%.0f,%.2f"",sum,ave);

}

main()

{

{struct s *p;

struct s xs[5]={{1,""mali"",89},

{2,""lili"",78},{3,""nimi"",90},{4,""lini"",65},

{5,""yisu"",82}};

p=xs;

f(p);

}

在該程序中,實參傳給形參的是結構體變量的地址,這樣在函數調用時就無需復制大量數據,從而減少時間和空間的開銷。編寫程序時,如果需要傳入一個占比較大內存的數據類型, 如數組或結構體變量,為了提高程序運行效率,都是傳遞該變量的地址。

指針指向的地址偏移的錯誤

這種情況常出現的原因是, 錯誤地將指向動態分配內存的指針當著指向一般變量的指針使用。示例程序如下:

void Test (void)

{

char *pChar=(char*)malloc(sizeof(char ));

char chs;

pChar=&chs;

free(pChar);

}

該程序的目的是想將chs內容傳遞給pChar指針指向的內存,但該程序代碼將會使指針pChar指向chs所占有的內存地址,其先前指向的內存空間將成為垃圾地址,因為程序沒有辦法再訪問該內存空間了。這里pChar是一個野指針,程序將會導致內存泄漏。同時,在調用free 函數釋放指針pChar的內存時,將會發生異常錯誤。因為此時pChar指向的內存已經不是由malloc函數動態分配的,不能使用free函數進行釋放。要避免這樣的情況發生就應該避免將指向動態分配內存的指針在釋放前指向其他變量的內存地址。所以,我們發現,如果不能正確的使用指針不僅不能提高程序的執行效率,反而給我們帶來了不必要的麻煩。

指針應用千變萬化, 關于指針的應用,還有很多內容值得探討, 以上只是指針的一些基本應用, 只有在編程過程中不斷總結指針的使用技巧, 通過實踐中的不斷摸索才能準確無誤的應用指針。

參考文獻:

c語言指針范文3

關鍵詞 C語言;指針;程序設計

中圖分類號TP39 文獻標識碼A 文章編號 1674-6708(2011)56-0173-02

1 C語言中的指針簡介

指針就是表示地址的一種變量,所以指針的范圍嚴格來說只能是自然數的,并且不能在兩個指針間進行加、乘、除這樣的運算。由于在C語言中每個數據類型都必有存儲空間,所以指針可以應用于幾乎所有的數據類型中。所以,從這個角度出發可以將指針分為:指向變量的指針、數組指針、字符指針、指向指針的指針、函數指針、結構變量的指針以及文件指針等等。

其中,指向變量的指針就是存儲變量的地址的。如 int * s這就是一個指向整型的指針,可以用于指向一個整型變量。如int a; 當p=&a時,就是將p存儲整型變量a的地址。這是指針最簡單的一種類型。所謂數組指針,就是指數組的名稱實際上是指向整個數組空間的首指針。如 int a[10];其中a本質上是一個指針,指向該數組的第一個位置,a[2]表示距離a指向空間向后2個位置所在空間中的存放的值。所以,a[2]=*(a+2)。字符指針本質上是數組指針的一種特殊情況,就是存放字符串的數組所對應的數組名。指向指針的指針這是一類很特殊的指針,用于存放指針的一類指針,在本質上與指向變量的指針十分相似。例如 char *ss[N]={“java”,”sss”,’’rrr”}。指向函數的指針就是指向函數入口地址的指針。結構變量的指針這類指針和指向變量的指針很類似,主要的區別在于結構變量可能有多個類型不同的變量,所以一般空間較大。文件指針就是對文件進行操作的指針。從上述的分類可以看出無論什么類型的指針其功能都是一樣的就是用于指向對象的地址空間罷了。

上面簡要的介紹了指針的定義和分類,現在簡要的論述一下指針涉及到的運算操作。首先由于指針是存放的變量地址的,所以第一個操作就是對指針進行地址賦值。如int a,*p;

P=&a,這就是對指針p進行進行賦變量a的地址,p指向變量a。當然也可以通過指針獲取指針指向地址空間所存儲的值。如int b=2,*p;p=&a,這是*p就表示p指向空間所存儲的值,在本例中就是a的值2。為了能在數組指針中通過指針能訪問到整個數組的值,所以??梢詫χ羔樳M行加減整數值,表示地址的前移或后移。如int a[10],*p,*s; p=a;s=p+2;其中s 的值表示數組中首地址向前移動2的位置,表示 a[2]對應的地址。 為了表示兩個地址間存在的距離,可以通過指針間的減法實現。當然指針涉及到的還有其他運算,現不詳述了。

2 C語言中的指針算術運算

指針可以加上或減去一個整數,這和c語言中的算術表達式意義是不同的。例二:

(1)int a[20]; (2)int *ptr=a; (3)……… (4)ptr++;

在上例中,指針ptr的類型是int*,它指向的類型是int,他被初始化為指向數組a的起始地址,接下來的第4句中,指針ptr被加了1,編譯器編譯程序時把指針ptr的值加上了sizeof(int)。

由于int型在32位機中的長度是4個字節,故原來ptr指向數組第0號單元開始的四個字節,此時指向數組從第4號單元開始的4個字節。

3 運算符&和*

&是取地址運算符,*是指針運算符或稱為間接訪問運算符。&a的運算結果是一個地址,即變量a的地址。*p為指針變量p所指向的存儲單元的內容,即p所指向的變量和值。下面舉例說明。例三:

int a=12;

int b;

int * p;

int * * ptr;

p=&a; /*把變量a的地址賦給指針變量p。 */

*p=24; /*把24賦給指針變量p所指向的存儲單元的內容 */

ptr=&p; /*把指針變量p的地址賦給指針變量ptr。*/

*ptr=&b; /*把變量p的地址賦給指針變量ptr。 */

* *ptr=34; /* *ptr的結果是ptr所指向的存儲單元的內容,即變量b的地址,再做一次*運算,結果就是一個int類型的變量。*/

4 C語言中的指針應用

在C語言中指針的十分應用廣泛,除具有一般的功能外,具體特殊功能的應用總結起來有三個方面:一是用于在函數中可以返回多個值;還有就是可以實現動態調用函數;最后就是實現數組的動態定義。其中,由于由函數的特點,一個函數只能有一個返回值,但在有些場合需要返回多個值,就可以定義指針參量來實現,其定義的基本框架如下:

Sss( int a,int *p )

{int s;

…….

………

Return s;

}

在這中情況下,函數不僅可以得到返回值(通過Return s來實現的),還可以通過指針p來返回相應的值。所謂指針能實現動態調用函數,這里用到的指針就是上文中提到的函數指針。函數指針就是指向函數入口地址的指針,我們還知道其實函數名就是一個函數指針。我們就是通過函數名實現動態調用函數的。在主調函數的參數中采用函數名充當實參就能實現函數的動態調用。該方法以簡短的代碼實現了復雜的功能。最后講到指針能實現數組的動態定義。從C語言的學習中,我們知道在定義數組時一定要指定數組的大小,否則,不能完整數組的定義。那么如何實現數組的動態定義。數組從本質上來講就是連續的空間集合罷了。那么,我們可以通過申請一個空間并賦值給一個指針變量,以此指針變量為首空間,就能獲取連續的空間,這與數組相同。當然數組還有許多應用,只有認真分析就能得到更多更好的應用實例。

5 結論

指針是C語言中的一個重要概念,也是C語言的一個重要特色。掌握指針的應用,可以使程序簡潔、緊湊、高效。每個學習和使用C語言的人,都應當多思考、多上機,在實踐中深入的學習和掌握指針。

參考文獻

[1]譚浩強.C語言設計[M].北京.清華大學出版社,2005,7.

c語言指針范文4

關鍵詞:指針;地址;數組;字符串;函數

中圖分類號:TP312.1

指針是C語言學習中的難點和重點,正是指針讓C語言威力無窮,要想成為一名優秀的C程序員,對指針有一個深入而完整的理解是先決條件。在教學中這一部分內容經常讓學生覺得疑惑。我在教學中總結了自己的經驗,現在把自己對C語言中指針的理解跟大家分享一下。

對于一個內存單元來說,內存單元的地址即為指針,其中存放的數據是該單元的內容,我們可以把內存想象成一個一個的房間,每個房間都有一個房間編號,每個房間可以住不同的房客。其中房間編號就是該存儲單元的地址即指針,房間中住的房客即該存儲單元的內容。我們用一個變量來保存房號,這個變量就是指針變量。指針變量也是一個變量,只不過里面存放的是地址即指針。指針變量的定義格式如下:

基類型 *指針變量名

其中基類型是指針變量指向的數據的類型,大家可以理解為房間里所住房客的類型?!?”只是一個符號,表示后面的變量是一個指針變量,不是指針運算符。大家可以用sizeof()函數對指針變量進行測試,得到結果是在相同的系統中不論何種數據類型的指針,即不管房間里住什么類型的房客,指針變量的長度是相同的,它都表示的是地址。在C語言中,有兩種指針運算符:“&”和“*”?!?”是取地址運算符,結合性為自右向左,功能是取變量的地址?!?”是取內容運算符,結合性為自右向左,用來表示指針變量所指向的變量。即一個為取地址,一個為取內容。大家注意在指針定義中的“*”不是運算符,不代表任何運算,只是表示后面的變量是一個指針變量,與運算符“*”是不同的。下面從8個方面講述一下指針的應用。

1 指針指向普通變量

這個是指針最基本的用法。舉例如下:int *px;定義了一個指向整型數據的指針變量,可以對它進行賦值,如px=&a;把變量a的地址賦給指針變量px,即指針變量px指向變量a。

2 指針指向數組

在C語言中,指針與數組之間的關系十分密切,都可以處理內存中連續存放的一系列數據。舉例如下:int a[10];int *px;px=a;px++;指針變量的基類型是數組的類型,即數組元素的類型。C語言中規定數組名是指針類型的符號常量,該符號常量是指向數組首元素的地址,即數組名就是數組首地址。所以可以直接把數組名賦值給指針變量。指針與數組在訪問內存時,采用統一的地址計算方法。在進行數據處理時,指針和數組的表示形式具有相同的意義。指針變量也可以帶下標。a[i]、*(a+i)、px[i]和*(px+i)這4種表示法全部等價,都是取數組元素的含義。但有一點區別,就是數組名是符號常量,是不能給數組名賦值的。即a=px;是錯誤的。指針變量px是可以對它賦值的。引用數組元素可以用下標法:a[i]、px[i],和指針法*(px+i)、*(a+i)。在指針指向數組的應用中經常用“++”、“——”和“*”一起使用,這時大家在分析時,注意自增和自減運算符與指針運算符是在同一個優先級,結合性為自右向左,如果有括號,優先計算括號內容,而且要注意自增和自減運算符在變量的前面和后面的區別,一個是先加減后使用,一個是先使用后加減。指針變量的算術運算,加減某一個整數n,不是地址值加減這個整數,而是地址值加減n個單元,每個單元的長度是由數據類型決定的,即px±n表示的實際位置的地址值是px±n*sizeof(type)。如上舉例,px++的含義不是地址加1,而是由int數據類型決定的,假設本系統int數據類型為2個字節,則px++的結果為地址px+2。

3 指針指向多維數組

以二維數組為例,int a[3][4];int *p;p=a[0];把二維數組a看作由3個一維數組組成,每個一維數組有4個元素。這時可以把指針看為在行指針列指針中變換。行指針中保存的是列指針。a代表整個二維數組的首地址,是行指針,可以看作指向一維數組的指針的指針,a指向的是列指針。a[0]代表第0行的首地址,是a指向的列指針,即a中的內容是列指針。a+1指向第1行的首地址,指向的也是指針。*a=a[0],*(a+1)=a[1]。用“*”把行指針轉換為列指針。如果二維數組的首地址為3000,則a+1為3008(假設一個int數據為2個字節),a+1的含義是a[1]的首地址。用a[0]+1表示第0行第1列元素的地址,其值為3002。a[i]和*(a+i)等價,可以理解為二維數組中的行指針取出的內容為一維數組的地址,即為指向一維數組的列指針。在其后再加上某個數,就轉為了一維數組中的某一列的列指針。a[i]+j和*(a+i)+j等價,是第i行第j列的地址,即為指向第i行第j列的指針。所以要取第i行第j列的內容,即為*(a[i]+j)和*(*(a+i)+j)都可以,這兩種方式是等價的。二維數組的指針運算可看為行指針列指針的轉換,如果數組維數大于2,則可以一層一層的進行指針分析。大家有興趣可以試著分析一下。

4 指針指向字符串

用字符指針指向字符串,然后通過字符指針來訪問字符串存儲區域。例如:char *str=“Good morning!”C語言對字符串常量是按字符數組處理的,實際上在內存開辟了一個字符數組用來存放字符串常量。定義了一個字符指針變量str,并把字符串首地址賦給它。注意只是把字符串首地址賦給指針變量,不是把字符串賦給str??梢园炎址礊橐粋€整體來處理,可以對一個字符串進行整體的輸入輸出。對字符串中字符的存取,可以用下標方法,也可以用指針方法,與數組類似,這是因為對字符串常量是按字符數組處理的。getchar是輸入字符,gets和scanf可以輸入字符串,但gets可以輸入帶空格的字符串,scanf則不帶空格。putchar是輸出字符,puts和printf可以輸出字符串。字符數組與字符串指針變量都可以實現對字符串的存儲和操作,但兩者是有區別的。首先字符串指針變量本身是一個變量,用于存放字符串的首地址,可以指向字符串的任何字符。字符串本身存放在以該首地址為首的一塊連續的內存空間中,并以“\0”作為字符串的結束。字符數組由若干個數組元素組成,可以用來存放整個字符串,字符數組名是字符串的首地址,是常量,不能修改其值。其次在使用上,兩者也有區別。對于字符串指針方式:char *px=“Good morning”;可以寫為 char *px;px=“Good morning”;而對于數組方式:char str[]={“Good morning”};不能寫為char str[20];str=“Good morning”;可以看出使用指針變量更加方便。

5 指針數組

指針變量本身也是變量,當指針變量集合成數組時,就形成了指針變量數組,簡稱指針數組。定義舉例如下:int *px[5];該數組的每一個元素都是整型指針。[ ]比*優先級高,因此px先與[5]結合,形成px[5]形式,這是一個數組形式,它有5個元素。再與px前面的“*”結合,表明每個數組元素是指針,指向一個整型變量。不要寫成int (*px)[5],這是指向一維數組的指針變量。這種用法常用來指向若干個字符串,是字符串處理更加方便。例如:char *name[]={“數據結構”,“操作系統”,“計算機網絡”};圖例如下圖2:

6 指向指針數據的指針變量,即指向指針的指針

當一個指針變量指向普通變量時,這樣的指針變量稱為一級指針變量。指向一級指針變量的指針變量稱為二級指針變量。指向二級指針變量的指針變量稱為三級指針變量,以此類推。在引入多級指針變量的概念后,當訪問一個指針變量的內容時,只有一級指針變量的內容才是要處理的數據,而多級指針變量的內容仍是一個指針變量。如上面例子,要一個指針指向數組name,就是一個二級指針變量。char **px=name;因為name是一個指針數組,所以用指針指向它,就必須定義一個二級指針變量。在分析多級指針變量時,注意區分哪個是地址,哪個是要處理的數據。

7 指針型函數

一個函數可以帶回一個整型值,字符值,實型值等,也可以帶回指針型的數據。函數返回值的數據類型決定了該函數的數據類型。有數值型函數,字符型函數等等。當函數的返回值是地址時,稱為指針型函數。定義例子如下:int *fun(int a,int b);fun先與運算符“()”結合,表明fun( )是一個函數,前面一個“*”,表明該函數返回一個指針,最前面一個int,表明該指針指向一個整型變量。在指針型函數中,用return語句返回一個地址。

8 函數指針

可以用指針變量指向整型變量、字符串、數組,也可以指向一個函數??梢杂靡粋€指針變量指向函數,然后通過該指針變量調用此函數,這種指針變量為指向函數的指針變量,簡稱函數指針。函數的存儲首地址又稱為函數的執行入口地址。函數名代表函數的入口地址。使用時,直接把函數名賦值給函數指針,再通過函數指針調用函數即可。定義舉例如下:int (*p)(形參表);int fun(形參表);p=fun;p即定義為一個函數指針,該函數的返回值為整型數據。函數指針與普通指針變量本質相同,都是保存地址。區別在于普通指針變量指向內存的數據存儲區,而函數指針指向內存的程序代碼區。普通指針變量的“*”運算是訪問內存的數據,而對函數指針執行“*”運算時,其結果是使程序轉移至該函數指針指向的函數入口地址,從而開始執行該函數,即調用其所指向的函數。在一個程序中,一個指針變量可以先后指向不同的函數。

以上是我在C語言教學中總結歸納的指針的8大用法,C語言是計算機程序設計的一門基礎課,其中指針是C語言的特色和精華。C語言中的指針經常讓學生不知所云,但其實只要掌握指針的本質就是地址,理解指針的基本概念和用法,指針其實是不難學的。希望我的文章能對大家學習C語言有所幫助。

參考文獻:

[1]譚浩強.C程序設計[M].清華大學出版社.

[2]Kenneth A.Reek.C和指針[M].人民郵電出版社.

c語言指針范文5

關鍵詞:指針;內存單元;內存單元地址;直接訪問;間接訪問

中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2009)31-0000-00

Full Parsing C Language Pointer Variable

LI Bei

(Finance and Economics College, University of Qinghai, Xining 810016, China)

Abstract: C language pointer is an important concept, the correct proficiency in the concept of pointers and pointer use will be able to design complex data structures and efficient procedures. This indicator focuses on the concept and its application in the program.

Key words: pointer; memory unit; memory cell address; direct access; indirect access

指針是C語言中的一個重要特色。c語言的強大及自由性,很大部分體現在其靈活的指針運用上。正確靈活地運用指針,能有效地表示出復雜的數據結構;能動態分配內存;方便地使用字符串;有效而方便地使用數組;在調用函數時能獲得一個以上的結果;能直接處理內存單元地址等,這對設計系統軟件是非常必要的。因此說指針是C語言的靈魂。

1 內存分配

計算機中的內存都是編址的,就象家的地址一樣。在程序編譯或者運行的時候,每遇到一次聲明語句(包括函數的傳入參數的聲明),編譯系統就為已定義的變量分配相應的內存單元,也就是說,每個變量在內存會有固定的位置,變量的數據類型不同,它所占的內存單元數也不相同。若我們在程序有如下定義:

int a=1,b=2;

float x=3.4, y = 4. 5 ;

double m=3.124;

char ch1='a', ch2='b';

如果將變量的地址保存在內存的特定區域,用變量來存放這些地址,這樣的變量就是指針變量,通過指針對所指向變量的訪問,也就是一種對變量的“間接訪問”。

設有:

int*pa,*pb; float*px,*py ;

double*pm; char*pch1, *pch2;

pa=&a;pb=&b;px=&x;py=&y;pm=&m;pch1=&ch1;pch2=&ch2;

現在我們訪問變量a、b、x、y、m、ch1、ch2對應的內存單元時,不僅可以通過變量名(直接訪問),也可以通過指向這些變量的指針(間接訪問)。

二者的關系如圖2所示。

此時訪問a變量對應的內存空間有: a、*pa二種方式。

2 指針就是一個整數

指針,是一個無符號整數(unsigned int),它是一個以當前系統尋址范圍為取值范圍的整數。32位系統下尋址能力(地址空間)是4G-byte(0~2^32-1)二進制表示長度為32bit(也就是4B)int類型也正好如此取值。

例如:程序1

#include

main()

{char *pt;

char t='h';

pt=&t;

putchar(*pt);}

程序2

#include

main()

{char *pt;

char t='h';

pt=(char *)1245048;/*1245048是pt的值*/

putchar(*pt);}

程序1得到的答案和程序2的答案一致。(不同機器可能需要調整一下pt的取值。)

3 C的按值傳遞

C中函數調用是按值傳遞的,傳入參數在子函數中只是一個初值相等的副本,無法對傳入參數作任何改動。但實際編程中,經常要改動傳入參數的值。這一點我們可以用傳入參數的地址而不是原參數本身,當對傳入參數(地址)取(*)運算時,就可以直接在內存中修改,從而改動原想作為傳入參數的參數值。

#include

void inc(int *val)

{(*val)++;}

main()

{int a=3;

inc(&a);

printf("%d" , a);}

在調用函數語句inc(&a)執行時, a的地址傳給了函數inc的形參(*val)并在函數體內執行了(*val)++;就等于改變了變量a的值。執行完inc函數后返回到main函數輸出a的值為4,操作*val,即是在操作a 了。

4 雙重指針(指向指針的指針)

設有如下程序:

#include

void main()

{ int a=3;int *p; int **p1;//p1是一個指向指針的指針(雙重指針)

p=&a;

printf("%d,%d\n",p,*p);

p1=&p; //指向了一級指針p

printf("%d,%d\n" *p1,**p1);

}

運行結果:1245052,3

1245052,3

若有:int a,*p1=&a,**p2=&p1; 則下面引用都是正確的。

*p1 //代表變量a

*p2 //代表表指針變量p1

**p2//代表變量a

5 指針數組、數組指針和指向函數的指針

指針數組是一組有序的指針集合,它所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變量。

設有:int a,b,c;int *p[3]={&a,&b,&c};

上述語句定義了一個名稱為p的指針數組,其中有三個元素p[0]、p[1]、p[2]分別指向三個整型變量a、b、c。此時可以通過*p[0]、*p[1]、*p[2]這三種方式來訪問a、b、c。

數組指針是指向數組的指針。數組在計算機內存中占據一片連續的存儲空間。數組名存放著這一連續空間的首地址(注意這是一個常數)。數組指針指向這一片連續空間的起始地址。

設有:

int a[10]{1,2,3,4,5,6,7,8,9,10},*p=a; /*p指向了起始地址*/

此時訪問數組a中第三個元素有三種方法:a[2]、*(a+2)、*(p+2)

設有:

int b[3][3]={{1,2,3},{4,5,6},{7,8,9}},*p=&[0][0]; /*此時p這是一個列指針*/

此時訪問數組b中第一行的第2個元素有:a[0][1] 、*(p+1)、*(*a+1)(注:a是一個行指針)三種方法。

指向函數的指針,從二進制角度考慮,數組名是該數組數據段首地址,函數名就是該代碼段的首地址。

設有如下程序:

#include

void inc(int *val)

{(*val)++;}

main()

{void (*fun)(int *);//定義了一個指向函數的指針(下轉第8716頁)

(上接第8713頁)

int a=3;

fun=inc; //這個函數指針指向了函數的入口地址

(*fun)(&a);//此時該語句與inc(&a); 等價

printf("%d" , a);}

程序運行的結果與上面第4個問題完全相同。豐富了訪問函數的方法。

6 結束語

指針可以指向任何類型的變量用,有效地表示出復雜的數據結構;指針可以指向函數;用于函數參數傳遞,達到更加靈活使用函數的目的,有了指針在編程時豐富了訪問內存單元的手段和方法,使C語言程序的設計更加靈活、實用、高效。

參考文獻:

[1] 陳強.C語言核心開發技術從入門到精通[M].北京:電子工業出版社,2009.

[2] 匡松.C語言程序設計[M].北京:中國鐵道出版社,2008.

c語言指針范文6

關鍵詞:C語言;指針;內容編排體系;教學方法

現今,幾乎所有的理科非計算機專業都開設了“C語言程序設計”課程,旨在培養學生的編程能力,提高計算機素養,為以后的學習、工作及科研打下堅實的基礎。

C語言有著豐富的內容,指針部分是C語言的基本組成部分,由于其在程序編寫及軟件開發中發揮著重要的作用,它成為C語言的重點內容;同時,由于其理解和掌握上存在的難度,它也是C語言的難點內容。

隨著教學改革的深入開展,許多學校都對該課程進行了調整,其中一項就是課時的調整,目前,存在著64+32、48+32、32+32等多種課時設置方案。在課時有限甚至是偏少的情況下,如何讓學生能更好地理解和掌握指針內容,成為教師面臨的研究課題。

關于整個課程的教學改革與創新,很多文章進行了介紹。尤其是關于指針內容的教學探討與改革,一直沒有停止,很多好的研究成果見諸報端,成為教師的有益參考和借鑒。這些探討主要集中在如何對內容進行講授、如何幫助學生理解難點解答疑問、講授手段探索、例題精選等方面,這對教師和學生來說都是不無裨益的。盡管如此,教學實踐中,還是經常會出現學生們對指針理解不夠透徹,從而影響指針的使用和應用。

通觀現在的C語言教材,在內容編排上,大多數是將指針內容獨立成章,對指針集中講解,并且其在整個內容編排體系中所處位置偏后。這樣編排的好處是指針內容比較集中,講起來易進行綜合分析、比較,但問題也有,即學生理解和消化指針內容的時間不夠,從而影響學習效果。

本文就是針對這一問題展開討論的,試圖在這方面能作些改革嘗試,改進教學效果。

1 指針內容體系的新設置

近年來,針對指針內容教學中出現的問題,北京師范大學信息技術與應用課程組進行了認真思考和分析,試圖找到解決問題的辦法。這些嘗試主要集中在上課的講授方法、手段、技巧,以及上機試驗的設計與考核等方面。我們的教學團隊也進行過探討,并且借鑒已有改革成果,教學效果有所改善,但不明顯。這促使我們進行更深刻的思考與反思,探究新的解決方法。2004年,我們的教學團隊開始了內容編排體系的改革嘗試。

改革課程內容編排體系,既要注意體系的科學與合理,更要兼顧能解決教學中存在的問題。于是,我們針對c語言中幾大主要模塊重新設計與布局,本文介紹的是指針內容體系的調整與改革。

新的指針內容編排體系的指導思想是打破指針內容編排上的“獨立成章”,代之以將指針內容貫穿于整個課程體系的始終。

在這種思想的指導下,我們在課程開始就設置指針的基本概念,讓學生更早認識指針這一對象。當然,這個時期的講解和介紹主要聚焦于基本概念,把它同基本數據類型一起進行講解。然后,在后面的章節中有機穿插講解相應的指針內容及應用。比方說,在講函數的時候,將指針和函數結合,講解指針性形參、指針值函數、函數指針等內容;在講數組時,將數組和指針結合,講解用指針操縱數組、指針數組、數組指針等內容;在講文件時,講解文件指針等;在講動態數據結構時,講解指針更廣泛和深刻的應用,等等。

這樣一種內容的編排方法,雖然不會出現指針內容的“獨立成章”,但是幾乎在后面的每章中都會出現與指針內容相關的小節,體現出“將指針內容貫穿于整個課程體系”的指導思想。這樣做,可能有人會擔心削弱了指針在C語言中的地位,其實,這種擔心是多余的。因為關于指針的內容沒有減少,只是將集中講解改為逐步、循序、適時講解。這樣做的好處是明顯的:

1)增加了學生的消化理解時間,更好地體現了指針內容的重要性。

將指針內容進行拆分,合理地分配到相應的章節中去,這顯然拉長了學生對指針內容的消化和理解時間,從而有助于對內容的更好掌握。這也很好地克服了以往內容偏后導致的理解消化時間不夠的不足。這種編排方法不僅講解了指針的全部內容,而且還跟其他內容進行了有機結合。因此,這種編排體系不僅沒有降低指針在C語言中的地位,反而更能體現指針內容的重要性。

2)降低了指針的難度和學生對指針的畏懼。

眾所周知,指針是C語言的重要內容,同時也是難點。許多學生從心理上有種恐懼感,一定程度影響了學習效果。我們設計的“化整為零”的內容編排方法,讓學生在慢慢消化的過程中,逐步掌握指針的內容。在看似不知不覺的過程中,達到了“各個擊破”的良好效果。因此,可以說在一定程度上降低了指針內容的難度。

3)增強了學生應用指針的直觀感受。

在相應的章節中穿插講解指針內容,并有機結合,給出恰當的實例和應用背景,這樣學生能感受到指針內容使用的必要性和自然感,了解應用的背景,從而增強對指針應用的直觀感受。

4)指針內容體系新設置示例。

在這里以函數和數組兩章為例來展示我們的新做法。

函數:

1 函數的定義

2 函數的調用

2.1 調用方式

2.2 調用機理

2.3 聲明被調函數與函數原型

2.4 嵌套調用

2.5 遞歸函數與遞歸調用

3 變量的作用域

3.1 局部變量

3.2 全局變量

4 變量的存儲類別

4.1 auto類別

4.2 extern類別

4.3 register類別

4.4 static類別

5 函數與指針

5.1 指針變量作函數的參數

5.2 指向函數的指針

5.2.1 用函數指針調用函數

5.2.2 用函數指針作函數參數

5.3 指針值函數

數組:

1 一維數組

1.1 定義與初始化

1.2 數組元素的引用

1.2.1 下標引用

1.2.2 指針引用

1.3 數組指針作函數參數

1.4 數組的排序

1.5 結構體數組

1.6 批量數據的存取與文件操作

2 二維數組與多維數組

2.1 定義與初始化

2.2 數組元素的引用

2.2.1 下標引用

2.2.2 指針引用

2.3 數組指針作函數參數

2.4 多維數組

3 字符數組與字符串

3.1 字符數組與字符串

3.2 字符串處理函數

3.3 指針與字符串

3.4 字符串指針作函數參數

4 指針數組與指向指針的指針

4.1 指針數組

4.2 指向指針的指針

4.3 指針數組與命令行參數

2 配套的改革措施和實踐效果

為了讓上面給出的指針內容編排方法真正發揮作用,我們還做了其他一些配套工作。

首先,進行整個課程內容體系的重新調整。因為指針內容涉及許多章節,所以,指針內容體系設置的改革必須同時考慮其他相關章節的安排與銜接,這樣才能真正發揮改革措施的作用。在這方面,我們主要考慮了數組、函數、文件以及動態數據結構等內容的重新編排。

其次,對上機實踐環節作了相應設計。上機實踐應當與課堂教學同步、配套。為此,我們針對新的內容設置體系,設計了相應的上機實踐任務、規范與要求。

最后,編寫了體現新思想的講義。為了配合教學改革,我們編寫了體現改革思想的講義,學生能在新的體系框架下開展學習,確保良好的學習效果。將來,我們將編寫正式的教材,使改革更深入。

亚洲精品一二三区-久久