赞
踩
数组名是数组第一个元素的地址,也是数组的首地址。
二维数组的数组名可看作是指向指针的指针。
#include <stdio.h>
int main()
{
int array[4][5]={0};
printf("sizeof int:%d\n",sizeof(int));
printf("array: %p\n",array);
printf("array + 1:%p\n",array + 1);
return 0;
}
结果如下:
分析如下:
array+1的地址比array的地址大:D4-C0=14
十六进制的14,转换为十进制为:20
每个整型是4个字节,相当于跨越了5个元素
解引用:在一个地址的前面加上取值运算符“*”,即把一个地址的值取出来,这种操作叫做解引用。
*(array+1)表示什么?
*(array+1) == array [1]
指向第二行子数组的第一个元素的地址
#include <stdio.h> int main() { int array[4][5]={0}; int i,j,k = 0; for(i=0;i<4;i++) { for(j=0;j<5;j++) { array[i][j] = k++; } } printf("*(array+1):%p\n",*(array+1)); printf("array[1]: %p\n",array[1]); printf("array[1][0]:%p\n",&array[1][0]); printf("**(array+1):%d\n",**(array+1)); return 0; }
二维数组里面其实是放了一维数组,这样一维数组对于二维数组来说就是元素,就像数值对于一维数组来说是一个元素。
结果如下:
*(array+1)+3 == &array [1] [3]
#include <stdio.h> int main() { int array[4][5]={0}; int i,j,k = 0; for(i=0;i<4;i++) { for(j=0;j<5;j++) { array[i][j] = k++; } } printf("*(array+1):%p\n",*(array+1)); printf("array[1]: %p\n",array[1]); printf("array[1][0]:%p\n",&array[1][0]); printf("**(array+1):%d\n",**(array+1)); printf("*(*(array+1)+3):%d\n",*(*(array+1)+3)); printf("array[1][3]:%d\n",array[1][3]); return 0; }
结果如下:
结论:
*(array+i) == array [i]
*( *(array+i)+j == array [i] [j]
*( * ( *(array+i)+j)+k) == array [i] [j] [k]
定义一个数组指针:
int(*p)[3];
#include <stdio.h> int main() { int array[2][3] = {{0,1,2},{3,4,5}}; int (*p)[3] = array; printf("**(p+1):%d\n",**(p+1)); printf("**(array+1):%d\n",**(array+1)); printf("array[1][0]:%d\n",array[1][0]); printf("*(*(p+1)+2):%d\n",*(*(p+1)+2)); printf("*(*(array+1)+2):%d\n",*(*(array+1)+2)); printf("array[1][2]:%d\n",array[1][2]); return 0; }
结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。