指針

什麼叫指針

指針與指針變量:一個變量的地址就稱之爲該變量的“指針”,而“指針變量”則是用來存放這個地址的變量。
地址:內存中存儲單元的位置編號就是地址。
存儲單元:大小固定,1Byte(字節)。
而在32位系統中我們最多可以有(2^32)個編號,即從0~0xffffffff
64位系統之最多有(2^64)個編號,即0~0xffffffffffffffff
如果定義如下變量與指針:

int i;
int* p=&i;

那麼,p是一個int型變量,它裏面存放的就是i的地址,而p則代表以p中所存儲的地址作爲起始地址,以p的基類型所佔的字節數作爲偏移量,訪問此空間。
p的起始地址就是i的地址,基類型爲int,所以從起始地址開始訪問四個字節的存儲空間,就得到了i的值。

指針變量作爲函數參數

我們都知道,一個函數只能有一個返回值,那麼當我們想返回多個值時就可以使用指針變量作爲函數參數。
在被掉函數中,通過對形參指針的間接訪問,可以改變主調函數中實參指針所指向的變量的值。
比如swap函數:
以前的做法是

void swap(int a[])
{
if(a[0]>a[1])
	{
		int t;
		t=a[0];
		a[0]=a[1];
		a[1]=t;
	}
}

可以通過數組來返回所要的值.
使用指針:

void swap(int* a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}

通過指針就可以返回所要的值。
但要注意,不能寫成這樣子:

void swap(int* a,int *b)
{
	int* t;
	*t=*a;
	*a=*b;
	*b=*t;
}

上面代碼中所定義的int* t;t並沒有初始化,所以t中存放的就是一個隨機地址,而這個地址系統中並不一定會有,所以這樣運行會出錯誤。

數組與指針

我們都知道指針是經常會和數組放在一起使用,如定義如下指針:
int a[10];
int* p;
p=a;
這就定義了一個指向數組首元素的指針,他存放的就是數組首元素的地址,即a[0]的地址。由C語言規定 p+1就是a[1]的地址,並不是在原來的地址基礎上簡單的加一,而是由p+(sizeof(p的基類型))*要加的數。
一些數組與指針等價的寫法:

int a[10];
int* p=a;

a[i]==*(a+i)==p[i]==*(p+i)
對二維數組來說:

int a[3][4];
int (*p)[4];
p=a;

a[i][j]==*(a[i]+j)==*(*(a+i)+j)==(*(a+i))[j]
int (*p)[4]是定義了一個指針變量p,該指針指向一個長度爲4,元素爲int的數組。

注:

數組名代表數組首元素地址
(數組名取地址)+1代表跳過整個數組
例如:
int a[3][4];
int (*p)[4],
p=a;
p是一個指針數組,p代表着a[0]的地址,而a[0]是一個包含着四個元素的數組名,
p+1==a[0]+1,即代表跳過整個a[0]數組,跳過四個int型數,即p+1跳過了16個字節。

字符串與指針

char s[]=“hello world !”;
char* p=“hello world !”;
可以寫s[3]=‘a’;
不可以寫p[3]=‘a’;
因爲p是一個指向字符串常量的指針,常量在運行期間不能被改變,而s是一個數組,可以被改變。
如果改寫爲
char s[]=“hello world !”;
char* p=s;
那麼兩個就都可以改變,因爲p變成了一個指向數組的指針。

一個可以實現鏈式表達式的字符串複製函數

char* strcopy(char* dest,const char* src)
{
	char* temp=dest;
	if(dest==NULL||src==NULL)
	return ;
	while(*dest++=*src++);
	return temp;
}
int main()
{
	char s[100];
	char s1[]="tom & jerry";
	char *p=NULL;
	p=s1;
	strcopy(s,p);
}
發佈了45 篇原創文章 · 獲贊 39 · 訪問量 3196
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章