1. 程式人生 > >指標,指標,指標。。。

指標,指標,指標。。。

1、指標常量與常量指標

int a = 10;
int * const p1 = &a;
const int * p2 = &a;

p1是不可改變地址的常量,即指標常量,但可以對它所指向的內容進行修改。

p2是指向常量的指標,即常量指標,它所指向的地址內容是不可修改的,但其本身確實可以修改的。

2、指標運算

#include<stdio.h>
int main()
{
	int *ip1,*ip2,ivalue;
	char *cp1,*cp2,cvalue;
	ip1 = (int*)0x500;
	ip2 = (int*)0x518;
	ivalue = ip2 - ip1;
	cp1 = (char*)0x500;
	cp2 = (char*)0x518;
	cvalue = cp2 - cp1;
	printf ("ivalue=%d  cvalue=%d\n",ivalue,cvalue);
	return 0;
}
執行結果:ivalue=6  cvalue=24

指標進行運算時,它的值與其型別有關。兩個地址同樣相差24個位元組,以整形指標相減結果為 24/4=6;以字元指標相減結果為 24/1=24;

3、指標與陣列

#include<stdio.h>
int main()
{
	int a[2][3][4] = {
		{{101,102,103,104},{111,112,113,114},{121,122,123,124}},
		{{201,202,203,204},{211,212,213,214},{221,222,223,224}}
	};
	printf("%d\t%d\n",**(a[0]+2),sizeof(a));
	return 0;
}
輸出結果:12196

分析:對於一位陣列a,*a等價於a[0],*(a+2)等價於a[2]。同理對於多維陣列*a[0]等價於a[0][0],*(a[0]+2)等價於a[0][2],**(a[0]+2)等價於*a[0][2]等價於a[0][2][0]。
sizeof(a)計算陣列a所佔記憶體空間:(2*3*4)*4Byte=96Byte。

4、指標陣列 與 陣列指標

int *p[N],p代表一個可存放N個整型指標型別元素的一維陣列,p是指標陣列,本質是陣列,是常量。

int (*p)[N],p代表一個指向由N個整型資料組成的一維陣列的指標,p是陣列指標,本質是指標,是變數。

5、指標函式 與 函式指標

int * f(int x),f代表一個返回值為整型指標的函式,f是指標函式,本質是函式。

int (*f)(int x),f代表一個指向函式的指標,該函式的引數和返回值均為整型,f是函式指標,本質是指標。