对字符数组输入输出数组名是否加取地址符的一些理解

字符数组名的两个含义:

定义了字符型数组char name[10]。name有两个含义

  1. 一个是代表着name这个数组第一个位置的地址,也就是name[0]的地址。可以说name就等价于&name[0]。
  2. 还有一种意思就是指代name整个数组。&name 就是整个数组的首地址。所以name和&name取得的地址是相同的。

下面举一个简单的例子:

#include<stdio.h>
int main(void)
{
    char name[10]={"hello csdn"};
    if(name==&name[0])
    {
        printf("name与&name[0]取得的地址相同,地址为:%p",name);
    }
    else
    {
        printf("取得的地址不同");
    }
    return 0;

以下为代码输出结果:
在这里插入图片描述

name和&name区别

不同点在于:name+1表示的是数组第二个元素的地址,而&name+1表示的是整个数组后又一个name数组的首地址,即&name[10]后一个新的name数组的首地址。如下:`

#include<stdio.h>
int main(void)
{
    char name[10]={"hello csdn"};
    printf("name+1的地址:%p\n",name+1);
    printf("&name+1的地址:%p\n",&name+1);
    return 0;
}

输出:
在这里插入图片描述

总结

所以说scanf("%s",name);和scanf("%s",&name);执行后的结果是一样的,都是name的首地址,都是给字符数组name赋值。推荐用 scanf("%s",name); ,第二种不容易理解也容易犯错,有些编译软件也不支持会报错。

补充

printf("%s",name); 字符串的读取。是从字符数组第一个地址name所对应的数据开始,对应ASCLL将其转化输出,直到遇见’\0’为止。这也就解释了printf("%s",name);中的name既然是地址,为啥不加*号,不是*name而是name。就是因为它的输出控制符的%s的作用。如果是printf("%d",name);的话,那么它输出的将是name第一个元素的地址。

  • 39
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值