数组和指针

来源:互联网 发布:网络语言的利与弊作文 编辑:程序博客网 时间:2024/05/17 23:40
#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);//2printf("*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));//5printf("%d\n",*w);//2}void testPointer3(){int a[] = {1,2,3,4,5};const int *p = a;//指向的元素是const intint const *q = a;//和前者相同int *const t = a;//const的指针,指向intp++;//(*p)++;//compile errorq++;//(*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;}
原创粉丝点击