要处理

来源:互联网 发布:lua 下载网络文件 编辑:程序博客网 时间:2024/05/17 22:24

一、关于指针的思考

指针的基本概念:

  1. int a[100];  

  2. int *p;  

  3. p=a;  

以上代码有一些基本的等价,需要铭记。

p等价于&a[0]等价于a

*p等价于a[0]等价于*a

*(p+1)等价于p[1]等价于a[1]等价于*(a+1)


但是,如果对数组名取址呢?


  1. int a[]={1,2,3};  

  2. int *p;  

  3. int **q;  

  4. p=a;  

  5. q=&a;  

  6. printf("%x\n",p);  

  7. printf("%x\n",q);  


这时候会发生错误,

 error C2440: '=' : cannot convert from &#39int (*)[3]' to &#39int **'


  1. printf("sizeof(p)=%d\n",sizeof(p));  

  2. printf("sizeof(q)=%d\n",sizeof(q));  

  3. printf("sizeof(a)=%d\n",sizeof(a));  

  4. printf("%x\n",a);  

  5. 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;

但是如果想用两重指针,是不能实现的。

原创粉丝点击