- #include <stdio.h>
- int main(int argc, const char * argv[]) {
- int a[2][3]={ 1,2,3,
- 4,5,6
-
- };
- for(int i=0;i<2;i++){
- for(int j=0;j<3;j++)
- printf("a%d%d=%p\t",i,j,&a[i][j]);
- printf("\n");
- }
- //数组名数组首地址是一个指针常量,指针类型是所指向元素的类型,对应第一个元素的地址,数组名加1等于加了一个相应类型的指针
- printf("a地址是:%p\n",a);//数值首地址就是第一个元素地址,二维数组第一个元素是一维数组a[0]
- printf("a[0]地址是:%p\n",a[0]);//一维数组地址就是第一个元素a[0][0]的值 &a[0][0]
- printf("a[0][0]的地址是%p\n",&a[0][0]);
- printf("a+1地址是:%p\n",a+1);//因为二维数组元素是行,所以加1等于加了一行
- printf("a[0]+1地址是%p\n",a[0]+1);//一维数组元素是基本类型int,所以加1 等于加了一个基本类型
- /*数组名虽然是一个指针常量,但是当用在两个地方时不是指针常量
- // 1 sizeof(数组名) 这个计算数组占总字节数
- // 2 &数组名 产生一个指向数组的指针
- */
- printf("&a地址是:%p\n",&a);//产生一个指向二维数组a的指针
- printf("&a[0]地址是:%p\n",&a[0]);//产生一个指向数组a[0]的指针
- printf("&a[0][0]的地址是%p\n",&a[0][0]);//就是元素a[0][0]的地址
- printf("&a+1地址是:%p\n",&a+1);//指向二维数组a的指针加1等于 跨越二维,所以越界
- printf("&a[0]+1地址是%p\n",&a[0]+1);//指向一维数组a[0]指针加1 等于跨越一行
- printf("&a[0][0]+1地址是%p\n",&a[0][0]+1);
- /*
- 来看看究极版本
- *(*(a+1)+1) 他得值是多少?,如果知道是多少,指针这里就基本懂了.
-
- // 1 a+1 等于指向达数组第二行的指针
- 2 *(a+1) 就是a[1]
- 3 a[1]+1 就是 a[1][1]的指针
- 4 *(a[1][1]) 就是 变量存储值 5
- */
- printf("%d\n",*(*(a+1)+1));
- return 0;
- }
复制代码 |
|