数组指针

来源:互联网 发布:网络管理工程师培训 编辑:程序博客网 时间:2024/06/05 12:00
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{


int arr1[5]={0,1,2,3,4};
cout<<*(arr1+3)<<endl;
cout<<*(*(&arr1+1)-2)<<endl;


int arr[3][3] = {0,1,2,
3,4,5,
6,7,8};
//这两个地址相同,但指针代表的类型不一样
cout<<&arr+3<<endl;
cout<<*(&arr+3)<<endl;
//判断是不是类型不一样在加个偏移量看得到的结果不同就知道了
cout<<**((&arr+2)+1)<<endl;
cout<<*(*(&arr+2)+1)<<endl;
cin.get();
return 0;

}

arr的类型是int [4],arr虽然可以当做指针使用,但是它实际上是一个数组类型,不信的话试试下面的输出:
int arr[4]. *p; // sizeof(arr) = 16, sizeof(p) = 4

然后&arr是什么类型呢,C语言中对任何一个东西取地址运算(&),都成为指针类型,那么它(&arr)的类型就是一个指针,指向什么?指向一个数组。这个指针怎么声明呢,是这个样子的:int (*p_arr) [4] = &arr; 

p_arr是一个指针,指向一个数组,数组的长度是4,数组中每个元素的类型是int。 

假设数组arr所在的起始位置是0(实际不可能,只是为了计算方便),arr+4的值是多少?arr虽然是数组类型,但是arr在使用的时候它被编译器认为是指向数组第一个元素的指针,它的值就是数组第一个元素的地址,即0,那么arr+4 = 0 + 4*4 = 16。然后&arr+4的值是多少呢?&arr是指针类型,指向一个数组,已知数组的大小是16字节(参考上面的sizeof(arr)),那么&arr + 4 = 0 + 16*4 = 64。那么&arr+4是什么类型的呢?很容易判断&arr+4的类型就是&arr的类型,由上面的分析可知,是int (*)[4]类型。*(&arr+4)又是什么类型?已知类型int (*)[4],执行指针的解引用操作(指针降级),就是去掉一个*符号,总而言之,就是int [4]类型。看到没有,指向数组类型的指针降级之后就变成数组类型了。数组类型在使用过程中仍被编译器看做一个指针,这就是为什么两行的输出是一模一样的:编译器打印一个指针时显示的是指针的值(64),编译器在打印一个数组时打印出来的是数组第一个元素的地址(64+0*4=64)

0 0
原创粉丝点击