| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 290 人关注过本帖
标题:再论数组
只看楼主 加入收藏
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
结帖率:44.44%
收藏
 问题点数:0 回复次数:1 
再论数组
程序代码:
#include<stdio.h>

char ga[] = "abcd";

void f1(char ca[])
{
    printf("in f1(char ca[]):\n");
    printf("&ca = %x, &(ca[0]) = %x, &(ca[1]) = %x\n\n", &ca, &(ca[0]), &(ca[1]));
}

void f2(char *pa)
{
    printf("in f2(char *pa):\n");
    printf("&pa = %x, &(pa[0]) = %x, &(pa[1]) = %x, ++pa = %x\n", &pa, &(pa[0]), &(pa[1]), ++pa);
    printf("pa[0] = %c\n\n", pa[0]);
}

int main(void)
{
    printf("in main():\n");
    printf("&ga = %x, &(ga[0]) = %x, &(ga[1]) = %x\n", &ga, &(ga[0]), &(ga[1]));
    f1(ga);
    f2(ga);
    return 0;
}

/* 输出在vs2010上 */

/*
in main():
&ga = cb3018, &(ga[0]) = cb3018, &(ga[1]) = cb3019

in f1(char ca[]):
&ca = 2cfc70, &(ca[0]) = cb3018, &(ca[1]) = cb3019

in f2(char *pa):
&pa = 2cfc70, &(pa[0]) = cb3019, &(pa[1]) = cb301a, ++pa = cb3019
pa[0] = b

请按任意键继续. . .

*/

书上有这么几句话:
    规则1:“表达式中的数组名”就是指针
    规则2:C语言把数组下表作为指针的偏移量
    “作为函数参数的数组名” 等同于指针

那么为什么 &pa[0] 会等于 &ga[1], ++pa 会等于 &(pa[0]) ? 刚才在GCC上面测试过,也是这样,只有用 pa[-1] 才会得到 'a'
而当函数形参为数组时,才会与实际相符合,但在 ANSI C标准6.7.1节中有这样一种解释 “在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针”,既然是这样,那么 &pa[0] 和 &ca[0] 为什么会相差一个步长?
2012-05-22 19:48
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
我知道答案了,问题出在 ++pa 上,居然被题目给坑了一回
2012-05-22 19:51
快速回复:再论数组
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039529 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved