指針
指針就是地址,指針也是C語言的一種數(shù)據(jù)類型,用指針類型定義的變量稱為指針變量。指針變量與普通變量一樣占有一定的存儲空間中存放的不是普通數(shù)據(jù),而是一個地址,一個變量的地址被稱為該變量的指針。
指針變量的定義
指針變量同其他類型變量一樣,也要先定義后使用。指針變量定義的一般形式為:
類型標識符 變量名;
(1) 變量名前的““號是指針類型的標志。定義時,在每個指針變量前都應有“*”號,以表示該變量為指針變量。
(2) 類型標識符是指針變量所指向的數(shù)據(jù)類型。指針變量的值僅指出指向對象存儲空間的首地址,而該存儲空間的大小,即存儲什么類型的數(shù)據(jù),則由指針變量的類型標識符決定。根據(jù)指針變量指向存儲空間中存放的不同數(shù)據(jù)類型,將指針變量為整型指針變量,字符型指針變量等。
例: char *point_c
Int *point_i
其中point_c是指向字符型數(shù)據(jù)的指針變量,而point_i是指向整型數(shù)據(jù)的指針變量,因此,指針變量point_c指向一個字節(jié)的存儲空間,而指針變量point_i指向兩個字節(jié)的存儲空間。
指針變量的使用
C語言指針變量的使用需要以下兩個運算符
(1) &:取地址運算符,它返回運算對象的內存地址。
(2) :指針運算符,也稱為“間接引用操作符“,它返回指針所指向變量的值,與&互補。
在程序中使用指針處理數(shù)據(jù)時,需要特別注意:指針變量在使用前必須被賦值確定的地址值,既可以用變量的地址對指針變量賦值,如“p1=&a;“,也可以用已經(jīng)賦值的同類型指針變量對指針變量賦值,如”p=p1;“。一個沒有賦初始值的指針變量是不確定的,可能指向內存中任何一個地方,如果使用該指針將產(chǎn)生不可預見的錯誤。
指針的算術運算
指針算術運算是以指針變量存儲的地址值作為對象進行的運算,它與普通變量的運算在種類和意義上是不同的。由于指針是地址,指針算術運算只能進行加減。
指針算術運算與指針類型有密切關系。指針變量進行加減時,其值(地址值)變動的單位不是字節(jié),而是指針變量指向的數(shù)據(jù)類型占用的內存單元數(shù)
Char p=1000
P+1 →1001
P+2→1002
Int p=2000
P+1=2002
P+2=2004
指針與數(shù)組
可以將一維數(shù)組的首地址或其元素的地址賦值給相同數(shù)據(jù)類型的指針變量 使該指針變量指向一維數(shù)組或其元素,進而利用該指針變量處理一維數(shù)組或其元素。
例如:
int a[10]
Int p;
P=&a[0];
將一維數(shù)組元素a[0]的地址賦給指針變量p,從而使p指向數(shù)組元素a[0]
(1) p+i就是數(shù)組元素a[i]的地址。這時由于指向數(shù)組的第一個元素,即a[0],根據(jù)指針運算規(guī)則,p+1即為a[1]的地址,p+i所指向的數(shù)組元素,即a[i].
(2) 指向數(shù)組的指針變量也可以帶下標,即p[i]與(p+i)等價
綜上所述,引用一維數(shù)組的元素,可以用以下兩種方法。
(1) 下標法。如a[i],p[i];
(2) 指針法,如(a+i),(p+i)
指針與函數(shù)
指針作函數(shù)的參數(shù)
函數(shù)的參數(shù)不僅可以是整型,實型,字符型等基本類型的數(shù)據(jù),還可以是指針類型數(shù)據(jù)。指針作參數(shù)的作用是將一個變量的地址傳送到另一個函數(shù)中,這樣,形參指針就指向主調函數(shù)中的變量,從而可以改變主調函數(shù)中變量的值。
由上例可見,使用指針作函數(shù)參數(shù)時,通過形參指針可以改變主調函數(shù)中變量的值,在函數(shù)調用結束后,這些被改變的變量值被保留下來,因此,可以用指針作函數(shù)參數(shù)的方式,從函數(shù)中得到多個返回值。
返回指針的函數(shù)
函數(shù)調用結束后,可以返回一個值給主調函數(shù),這個值可以是整型,實型,字符型等基本類型數(shù)據(jù),也可以是指針,即地址。
返回指針值函數(shù)的一般定義形式為
類型標識符 函數(shù)名(形參表)
例如
Int f(int a,int b)
{……}
其中,函數(shù)名f前面的表示此函數(shù)是指針型函數(shù),即該函數(shù)的返回值是指針。前面的int表示返回指針是指向整型數(shù)據(jù)的指針。
例 編寫str_chr函數(shù),其功能是在一個字符串中查找一個指定字符,找到后返回該字符的地址,若未找到則返回空指針。在main函數(shù)中調用str_chr函數(shù),查找字符‘e’在字符串“how are you!“中的地址以及相對位置并輸出。
指向函數(shù)的指針
C語言的指針變量不僅可以指向變量,字符串和數(shù)組,也可以指向函數(shù)。程序執(zhí)行時,函數(shù)代碼被存放在用戶程序區(qū)。編譯系統(tǒng)在編譯源程序時為每個函數(shù)分配一個入口地址,這個入口地址被稱為函數(shù)的指針。因此,可以將函數(shù)的指針賦給一個指向函數(shù)的指針變量,然后通過該指針變量調用其指向的函數(shù)
說明:
(1) 指向函數(shù)的指針變量定義的一般形式為:
類型標識符 (指針變量名)( );
(2) 可以用函數(shù)名調用函數(shù),也可以用指向函數(shù)的指針變量調用函數(shù),兩種方法作用相同。
(3) 指向函數(shù)的指向變量專門用來存放函數(shù)的入口地址,它并不固定指向某個函數(shù),把哪個函數(shù)的地址付給它,它就指向哪個函數(shù),一個指向函數(shù)的指針變量可以指向不同的函數(shù)。
(4) 對指向函數(shù)的指針變量賦值,只需給出函數(shù)名,不涉及實參與形參的結合問題。例如:f=add
(5) 用指向函數(shù)的指針變量調用函數(shù)時,只需用(f)代替函數(shù)名即可,在(f)之后的括號中根據(jù)要求寫上實參,例如:z=(*f)(x,y);
(6) 對指向函數(shù)的指針變量進行加減運算沒有意義,不能通過f++指向下一條指令或者下一個函數(shù),如f++,f--,f+n等運算都無意義。
include<stdio.h>
int main()
{
int a,b;
int p_a,p_b;
a = 100;
b = 200;
p_a = &a;
p_b = &b;
printf("\n&a=%xh,&b=%xh\n",&a,&b);
printf("p_a=%xh,p_b=%xh\n",p_a,p_b);
printf("&p_a=%xh,&p_b=%xh\n",&p_a,&p_b);
printf("a=%d,b=%d\n",a,b);
printf("p_a=%d,p_b=%d\n",p_a,p_b);
return 0;
}
include<stdio.h>
void swap(int p1,int p2)
{
int temp;
temp = p1;
p1 = p2;
p2 = temp;
}
int main()
{
int a = 0,b = 0;
int point_a,point_b;
point_a = &a;
point_b = &b;
printf("請輸入a和b:\n");
scanf("%d%d",&a,&b);
if(a > b)
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
include<stdio.h>
char str_chr(char str,char ch)
{
while((str!=ch)&&(str!=NULL))
str ++;
if(*str==NULL) return (0); //未找到,返回空指針
return(str);
}
int main()
{
char *p,ch,str[]="How are you!";
ch = 'e';
p = str_chr(str,ch);
if(p)
{
printf("string starts at %xh.\n",str);
printf("char'%c'at%xh.\n",ch,p);
printf("position %d.\n",p-str);
}
else
printf("not found!\n");
return 0;
}