一、关于指针的思考
指针的基本概念:
-
int a[100];
-
int *p;
-
p=a;
以上代码有一些基本的等价,需要铭记。
p等价于&a[0]等价于a
*p等价于a[0]等价于*a
*(p+1)等价于p[1]等价于a[1]等价于*(a+1)
但是,如果对数组名取址呢?
-
int a[]={1,2,3};
-
int *p;
-
int **q;
-
p=a;
-
q=&a;
-
printf("%x\n",p);
-
printf("%x\n",q);
这时候会发生错误,
error C2440: '=' : cannot convert from 'int (*)[3]' to 'int **'
-
printf("sizeof(p)=%d\n",sizeof(p));
-
printf("sizeof(q)=%d\n",sizeof(q));
-
printf("sizeof(a)=%d\n",sizeof(a));
-
printf("%x\n",a);
-
printf("%x\n",&a);
我们加上这三句,看看三个指针占用的内存大小,发现是
大小分别是4,4,12。那就意味着,&a与&a+1的距离是3个int单位(12 bytes)。
同时可以看到,a与&a的地址是一样的。
所以我们可以知道,虽然对a取&了,但是并不是传统意义上取a值所在的内存地址。
同时我们要清楚,&a的数据类型是 int (*)[3],占用12个bytes。
所以int **q; q=&a会报错。
怎么解决这个问题呢?将q的数据类型声明为int (*q)[3];
或者int *q; q=(int *)&a;
但是如果想用两重指针,是不能实现的。