您的位置:首页 > 编程语言 > C语言/C++

C语言指针访问数组元素

2015-06-29 16:40 411 查看
数组元素都是连续存放的,数组变量本身保存了第一个数组元素的地址,系统可以快速定位各元素所在内存,从而快速访问数组元素。

元素地址=首地址 + 数组元素类型占用字节数 * 索引

指针变量加减n时,代表将该指针的地址加减n*变量字节大小。

如果arr是数组,arr+1代表索引为1的元素地址,arr存放索引为0的元素地址, arr +1与 &arr[1]等价

如果arr是数组,*(arr+1)取索引为1的元素值,即*(&arr[1])。*(arr +1)与arr[1]等价

当两个指针变量指向同一个数组时:

两个指针变量可以比较,指向前面元素的指针小于指向后面元素的指针;

两个指针变量可以相减,返回两个指针所指数组之间元素的个数。

例子1:

//指针访问数组元素
//元素地址=首地址 + 数组元素类型占用字节数 * 索引
void zhizhentest2_1(){
int arr[] = {10,4,6,-2,5};
printf("输出arr存放的地址:%p\n", arr);
printf("输出第一个元素的地址:%p\n", &arr[0]);
printf("输出第一个元素的值:%d\n", arr[0]);
printf("输出第一个元素的值:%d\n", *(arr+0));
printf("输出第一个元素的值:%d\n", *arr);

printf("输出第二个元素的地址:%p\n", &arr[1]);
printf("输出第二个元素的地址:%p\n", arr +1);
printf("输出第二个元素的值:%d\n", arr[1]);
printf("输出第二个元素的值:%d\n", *(arr +1));
}
输出:

输出arr存放的地址:0012FEC4

输出第一个元素的地址:0012FEC4

输出第一个元素的值:10

输出第一个元素的值:10

输出第一个元素的值:10

输出第二个元素的地址:0012FEC8

输出第二个元素的地址:0012FEC8

输出第二个元素的值:4

输出第二个元素的值:4

例子2:

//通过数组名+数组索引获取对应元素的地址来遍历数组
void zhizhentest2_2(){
int arr[] = {10,4,6,-2,5};
int len = sizeof(arr)/sizeof(arr[0]);
for(int i=0; i< len; i++){
printf("arr[%d]=%d\n", i, *(arr + i));
}
printf("通过指针取数组后用下标取\n");
for(int j=0; j<len;j++){
printf("arr[%d]=%d\n", j, arr[j]);
}
}
输出:

arr[0]=10

arr[1]=4

arr[2]=6

arr[3]=-2

arr[4]=5

通过指针取数组后用下标取

arr[0]=10

arr[1]=4

arr[2]=6

arr[3]=-2

arr[4]=5

例子3:

//通过移动指针变量来遍历数组
void zhizhentest2_3(){
int arr[] = {10,4,6,-2,5};
int len = sizeof(arr)/sizeof(arr[0]);
for(int* p=arr; p< arr + len; p++){
printf("%d\n", *p);
}
}
输出:

10

4

6

-2

5

指针访问二维数组:

void zhizhentest2_4(){
int arr[3][4]={
{4,2,7,11},
{10,20,-1,5},
{1,23,4,9}
};

printf("以下输出数组首地址:\n");
printf("输出arr的地址:%p\n", arr);
printf("输出*arr的地址:%p\n", *arr);
printf("输出arr[0]的地址:%p\n", arr[0]);
printf("输出*arr[0]的地址:%p\n", &*arr[0]);
printf("输出arr[0][0]的地址:%p\n", &arr[0][0]);

printf("\n");

printf("输出arr[1][0]的地址:\n");
printf("输出arr[1]的地址:%p\n", arr[1]);
printf("输出arr[1][0]的地址:%p\n", &arr[1][0]);
printf("输出arr +1的地址:%p\n", arr + 1 );
printf("输出*(arr + 1)[0]的地址:%p\n", &(*(arr + 1))[0]);

printf("\n");

printf("输出arr[2][3]的地址:\n");
printf("输出arr[2][3]的地址:%p\n", &arr[2][3]);
printf("输出*(arr + 2) +3 的地址:%p\n", *(arr +2) + 3);
printf("输出arr[2] + 3的地址:%p\n", arr[2] + 3);
printf("输出*(arr + 2)[3]的地址:%p\n", &(*(arr + 2))[3]);

}
输出:

以下输出数组首地址:

输出arr的地址:0012FEA8

输出*arr的地址:0012FEA8

输出arr[0]的地址:0012FEA8

输出*arr[0]的地址:0012FEA8

输出arr[0][0]的地址:0012FEA8

输出arr[1][0]的地址:

输出arr[1]的地址:0012FEB8

输出arr[1][0]的地址:0012FEB8

输出arr +1的地址:0012FEB8

输出*(arr + 1)[0]的地址:0012FEB8

输出arr[2][3]的地址:

输出arr[2][3]的地址:0012FED4

输出*(arr + 2) +3 的地址:0012FED4

输出arr[2] + 3的地址:0012FED4

输出*(arr + 2)[3]的地址:0012FED4

指针遍历二维数组:

void zhizhentest2_5(){
int arr[3][4]={
{4,2,7,11},
{10,20,-1,5},
{1,23,4,9}
};
for(int* p = arr[0]; p < arr[0] + 12; p++){
if((p-arr[0])%4 == 0 && p > arr[0]){
printf("\n");
}
printf("%d, ", *p);
}
printf("\n");

}
输出:

4, 2, 7, 11,

10, 20, -1, 5,

1, 23, 4, 9,

arr[0]表示第一个数组元素,假设内存地址为0x00010001,int占4字节,arr[0]+1获取第一个数组元素的第2个元素(0x00010005),每加1就指向下一个元素

因为数组元素是连续存放的,所以可以通过不断+1来获取下一个元素的指针。

arr表示的是二维数组,里面的元素是一维数组, +1获取的是下一个数组元素,中间间隔了一个长度为4的int型一维数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: