【问题标题】:Function with character pointer as arguments以字符指针为参数的函数
【发布时间】:2016-03-11 21:15:30
【问题描述】:

在下面的代码中,函数print_uart传输字符串“Hello world”时,*s中究竟收到了什么?是字符H还是存储字符串“Hello World”的内存地址??

volatile unsigned int * const UART0DR = (unsigned int *)0x101f1000;
void print_uart0(const char *s)
{
  while(*s != '\0')  
  {                                 /* Loop until end of string */
    *UART0DR = (unsigned int)(*s);  /* Transmit char */
    s++;                            /* Next char */
  }
}
void c_entry() 
{
    print_uart0("Hello world!\n");
}

【问题讨论】:

  • volatile unsigned int * const - 这意味着恒定和易变
  • s 是指针,*s 是字符值。 *UAT0DR = (...)(*s) 使用价值。
  • @Ed,指针是const,它指向的东西是volatile
  • @chux - 没想到这一点。谢谢

标签: c pointers


【解决方案1】:

s 是指向存储字符串“Hello World”的内存的指针。
*s 是第一个字符,'H'

【讨论】:

    【解决方案2】:

    编译器获取所有字符串常量并为它们分配内存。在s 中,您在内存中有一个存储位置,通过*s,您将获得该字符串的第一个字符。

    还需要注意的是,使用完全相同的字符串常量可能会指向内存中的相同位置 -> 这样的优化会节省一些内存。

    【讨论】:

      【解决方案3】:

      参数 s 指向字符串文字“Hello world!\n”的第一个字符。字符串默认以 \0 结尾 所以while循环

      while(*s != '\0')  
      {                                 /* Loop until end of string */
        *UART0DR = (unsigned int)(*s);  /* Transmit char */
        s++;                            /* Next char */
      }
      

      一次复制一个字符 H,e,... 到同一个地址 'UART0DR'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-22
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多