要处理

一、关于指针的思考

指针的基本概念:

  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;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值