现在的位置: 首页 > 综合 > 正文

数组和指针

2019年10月15日 ⁄ 综合 ⁄ 共 1293字 ⁄ 字号 评论关闭
#include <iostream>

using namespace std;

void testPointer(){
	int a[] = {1,2,3,4,5};
	int *p = a;		//本身就是int型指针
//	int *q = &a;	//转换成int型指针
	int *t = &a[0];	//本身就是int型指针
	p++;
//	q++;
	t++;
	printf("*p:%d\n",*p);	//2
//	printf("*q:%d\n",*q);	//2
	printf("*t:%d\n",*t);	//2
}

void testPointer2(){
	int a[] = {1,2,3,4,5};
	int *p = a+1;	//一维数组数组名字a表示数组中第一个元素(int)的地址
//	int *q = &a+1;	//在转换成int型指针之前的+1操作被解释为数组的长度
	int *w = &a[0]+1;	
	printf("%d\n",*p);		//2
//	printf("%d\n",*(q-1));	//5
	printf("%d\n",*w);		//2
}

void testPointer3(){
	int a[] = {1,2,3,4,5};
	const int *p = a;	//指向的元素是const int
	int const *q = a;	//和前者相同
	int *const t = a;	//const的指针,指向int
	p++;
	//(*p)++;	//compile error
	q++;
	//(*q)++;	//compile error
	(*t)++;
	//t++;		//compile error
}

void testPointer4(){
	int a[4][4] = {  
                  {1,2,3,4},  
                  {50,60,70,80},  
                  {900,1000,1100,1200},  
                  {13000,14000,15000,16000} }; 
	int (*p1)[4] = a;		//指针数组,
	int (*p2)[4] = &a[0];	//指针数组,分别指向数组a[0],a[1]...的地址
    int *p3 = &a[0][0];		//第一个元素的地址
	//数组p1的大小是4,所以是*(p3+1)
	cout<<*(p3+sizeof(p1)-3)<<endl;	//2

	//p2指向第一个数组a[0],减一就指向前一个数组的地址,*(&a[-1])就变成
	//前一个数组的第一个元素的地址,+16就变成13000的地址了。
	cout<<*(*(p2-1)+16)+2<<endl;	//13002

	//p1也是指针数组,指向a[0]的地址,然后+3就是指向a[3]的地址
	//*(&a[3])就变成了a[3]的第一个元素的地址,-2变成1100的地址
	cout<<*(*(p1+3)-2)+1<<endl;		//1101

	//一维数组数组名代表一个元素的地址,二维数组数组名代表第一个子数组的地址
	//所以a+1代表a[1]的地址,然后*(&a[1])代表a[1]的第一个元素的地址。-1变成4的地址。
	cout<<*(*(a+1)-1)<<endl;		//4
}

int main(){
	testPointer();
	testPointer2();
	testPointer3();
	testPointer4();
	return 0;
}

抱歉!评论已关闭.