读博文《二维指针和二维数组可以互用吗?》有感

引用自:http://blog.sina.com.cn/s/blog_6237dcca0100hham.html

博文中博主的字眼有些用的附带个人情感色彩,so,我们阅读的时候不可以囫囵接受。

其中,有些东西不怪解释不清楚, 只能说c中的指针太灵活太灵活。

这里,我想说的就是指针的理解以及“[]”运算符

先说下简单的运算符吧

对于p[i]来说,编译器将这样解释==〉*(p+i*(sizeof(type)))

所以我们如果在运算符左侧放的只能是指针或者起码看起来是指针的东西。

printf("%d", 1[0]); //编译器报错
printf("%d", ((int*)1))[0] //编译器通过 
仅此而已。
对于指针,我们这里主要讨论多维指针

其实一个数据是数据还是指令,那要看我们怎么理解了,同理,一个数据是指针还是普通的数值,也是理解方式的问题。

这里多维指针的问题,追根到底,就是编译器的理解问题。

下面用一个小实例来说明下:

int a[][2] = {1, 2, 3, 4};
int *p = a;
int **q = a;

int main()
{
    printf("%d %d", p[0], q[0]); //输出结果:1 1
    return 0;
}

程序结果说明,对于p和q,我们用相同的方式操作,取得结果 都是一样的。

只不过理解方式不一 样。虽然程序里的p[0]和q[0]都是1,但是,在编译器看来p[0]的类型是int,而q[0]的类型是int*,这里输出的时候不过类型默认转换了一次。

 如果我们这样写:

int a[][2] = {1, 2, 3, 4};
int *p = a;
int **q = a;

int main()
{
    printf("%d %d", p[0][0], q[0][0]);
    return 0;
}

那么编译器会对p[0][0]报错,而q[0][0]则是被编译器通过的,原因就这里不用说了吧。

对于p和q来讲,它们都是普普通通的指针变量而已,只不过是维数不同罢了,简言之,只是编译器对它们的理解不同罢了。

我们对它们操作可以随心所欲的(当然,不能做出让编译器不理解的操作 )。

int a[][2] = {1, 2, 3, 4};
int *p = a;
int **q = a;

int main()
{
    printf("%d %d\n", p[0], p[3]);
    printf("%d %d\n", q[1], q[2]);
    return 0;
}
当然,  对于多维数组,明智的做法是我们定义指针应当指出其低维的维数。例:int a[1][2][3][4] ===〉int (*p)[2][3][4]

这样的话,我们就不用手动的计算多维数组的每一维偏移量了,使用的时候跟直接数组名没什么两样。例:a[0][1][2][3] == p[0][1][2][3]

当然,这只是建议~~

所以结论是:二维数组可以传值给二维指针,但是二维指针不能和二维数组互用



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值