char *p 与 extern char*p区别

1. 首先要明白数组和指针是怎么访问的

    1. 数组访问形式 

char a[] = "abcdefg";
c = a[i]; //i=0~6
      编译器符号表示一个地址 假设  a 值 9980   

      运行时 取i的值

      取地址(9980+i)的内容


    2. 指针访问形式

char *p;
char c = *p;

     假设p的地址为 4624

     运行时  取 4624 内容 也是一个地址 5081

     取地址5081的内容


char *p = "abcdefg";
c = p[i];

     取4624中内容 5081

     取i的值

    取地址(5081+i)的内容


2.

file1

char p[10] = "abcdefg";  //p的值9980


file2

extern *p;


则在file2中会将p当成指针看待进行三步操作 

首先 取9980的内容结果是'a',  然后把'a'当成地址取值,这里就出现问题了。这就是为什么不能将char *p 声明成 extern char *p;


那 为什么下面这个又是正确的呢?

void f( char *p )
{
    printf( “%d\n”, p[2] );
}
int main()
{
    int v[] = {1, 2, 3};  //v的值 9980
    f( v );
    return 0;
}

因为函数参数传递是按值传递,那么p里面的值就是9980.

所以就很容易了


另外:我看网上有人说这样编译不会出问题, 但是我在VC6.0 的环境下 编译时 会报错。有知情人麻烦告知。谢谢。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值