【问题标题】:printf() prints whole arrayprintf() 打印整个数组
【发布时间】:2013-06-02 11:09:02
【问题描述】:

假设我的 C 程序中有以下代码:

#include <stdio.h>

void PrintSomeMessage( char *p );

int main(int argc, char *argv[]) {
    char arr[10] = "hello";
    PrintSomeMessage(&arr[0]);
    return 0;   
}

void PrintSomeMessage(char *p)
{
    printf("p: %s",p);
}

为什么这个输出会是整个单词“hello”而不是单个字符“h”?

不过,我明白,如果我在格式化程序中输入 "%c",它只会打印一个字母。但是,这个地址中每个字母的内存地址还是不同的。请问有人给我解释一下吗?

【问题讨论】:

  • 注意:%c 不需要打印地址,%s 需要前往\0,正如@Rohan 在回答中解释的那样。
  • @SuvP printf()%c 需要 value 变量,它不应该需要地址来访问 single 的值很明显/合乎逻辑b> 元素(可以按值传递)。在哪里打印需要地址才能到达的字符串,直到\0 遇到他在回答中解释的同一个 Rohan。此外,即使使用%c,也需要将地址存储在内存中
  • @SuvP 到printf() %c 你至少需要一个char 变量,而不是它的地址。
  • 注意,&amp;arr[0]&amp;*(arr+0)&amp;*arrarr,所以 PrintSomeMessage(&amp;arr[0])PrintSomeMessage(arr)

标签: c arrays char printf


【解决方案1】:

但是,这个地址中每个字母的内存地址还是不一样的。

内存地址不同,但作为字符数组,它们是连续的。当您传递第一个元素的地址并使用%s 时,printf 将打印从给定地址开始的所有字符,直到找到'\0'

【讨论】:

    【解决方案2】:

    arrays 的情况下,基地址(即数组的地址)是 数组中的第一个元素。数组名称也充当指针。

    考虑一排房子(每个都是数组中的一个元素)。要识别行, 你只需要第一个房子的地址。你知道每个房子后面跟着下一个(顺序)。得到第一个房子的地址,也会给你行的地址。

    如果是字符串文字(在声明中定义的字符数组),它们会自动 附加\0

    printf 使用格式说明符和提供的地址打印。因为,你使用%s 它从第一个地址打印(使用算术递增指针)直到 '\0'

    【讨论】:

    • 昨天我在浏览这篇文章时似乎在滚动时误点击了;我现在通过查看我的个人资料才发现。不幸的是,由于我的投票被锁定,因此我无法在没有编辑的情况下扭转错误。
    猜你喜欢
    • 2013-12-14
    • 2015-04-12
    • 2015-04-10
    • 1970-01-01
    • 2019-07-06
    • 2014-04-22
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多