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

【C/C++】深入理解指针和数组的关系

2013-07-13 17:26 381 查看

对数组名进行取地址运算

int a[] = {1,2,3};
int (*p)[3] = &a;    //注意左值


对数组名取地址,得到的指针为指向整个数组的指针。

形参数组

形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度,需要另外加参数。

一维数组指针

#include <stdio.h>

//void array_add(int a[][], int len)
int array_add(int (*p)[3], int row, int lines)
{
int i,j;
int result = 0;

for(i=0; i<row; i++)
for(j=0; j<lines; j++)
result += p[i][j];

return result;
}
int main(void)
{
//一个二维数组可以看做是两个一维数组,而a[0]和 a[1]分别是这两个一维数组的名字。
int a[2][3] = {1,2,3,4,5,6};
int (*p[2])[3]    = {a, a+1};
int (*p1)[3] = a;//数组的名字代表指向数组首元素的首地址(这里二维数组的首元素是一个一维数组)
int (*p2)[2][3] = &a;//对数组名取地址之后,其指针指向整个数组,在这里p2指向整个二维数组,若p2+1,则跳过24个字节,即整个数组。
int *p3 = a[0];
int  (*p4)[3] = &a[0];
int b = a[0][0];
int  *p5  = *a; //在这里a可以看做是指向行的地址,加*之后变成了指向列的地址。(这种描述方式只是便于理解)
int result = 0;

result = array_add(a, 2, 3);
printf("result = %d\n", result);

printf("a[1][1] = %d\n", *(*(a+1)+1));
printf("a[1][1] = %d\n", *(*(p1+1)+1));
printf("a[1][1] = %d\n", p1[1][1]);
printf("a[1][1] = %d\n", (*p2)[1][1]);
printf("a[1][1] = %d\n", *(p3+4));
printf("a[1][1] = %d\n", *(*(p4+1)+1));

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: