当一个通过另一个参数的引用传递时,printf如何处理它的参数

Sou*_*jee 4 c string printf pointers arguments

我发现了一些有趣的东西,但无法解释它.我正在编写一个简单的例程来反转字符串.这很好,没有抱怨.

我的问题在于printf.当我单独打印原始字符串时,它打印正确,但是当我打印原始字符串作为第一个arg,而函数调用reverse作为第二个时,两者都显示为反转.

输出:

|| abcdthelgko ||
Orig Str:| okglehtdcba |,Rev Str | okglehtdcba |

码:

char* ReverseStr(char* str, int len)
{
  char *start = &str[0], *end = &str[len-1];
  char temp;

  while(start < end)
  {
    temp = *start;
    *start = *end;
    *end = temp;

    start++;
    end--;
  }
  return str;
}

int main()
{
  char str_unique[] = "abcdthelgko";
  int str_unique_len = sizeof(str_unique)/sizeof(str_unique[0]);

  printf("\n || %s || \n", str_unique);
  printf("Orig Str: | %s |, Rev Str | %s |\n", str_unique, ReverseStr(str_unique, str_unique_len-1));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

*反馈后修改:* 测试2个理论1.Printf从右到左处理注释2.如果函数调用是args之一,那个函数在printf之前被调用,我做了另一个示例代码来改变值通过引用传递的变量.我看到的是,在变量值中,它可以正常工作:================== OUTPUT ================== ====

 i = 5, changed i = 2, again i= 2 

 changed i = 2, i= 2 

 i = 5, changed i = 2 
Run Code Online (Sandbox Code Playgroud)

==================代码======================

int* change (int* addr);

int main()
{
  int i;
  i=5;
  printf("\n i = %d, changed i = %d, again i= %d \n ", i, *change(&i), i);

  i=5;
  printf("\n changed i = %d, i= %d \n", *change(&i), i);

  i=5;
  printf("\n i = %d, changed i = %d \n", i, *change(&i));
  return 0;
}

int* change (int* addr)
{
  *addr = 2;
  return (addr);
}
Run Code Online (Sandbox Code Playgroud)

Ami*_*mit 6

由于ReverseStr它是就地操作(称为改变输入),因此"原始"字符串不再可用.

当您使用另一个函数调用作为其参数之一调用函数时,首先执行内部调用.考虑:

printf("%lf", pow(2, 2));
Run Code Online (Sandbox Code Playgroud)

pow之前调用power()函数printf.在你的代码中也是如此,并且会改变原始字符串,因此在printf调用它时,它会获取"在两个参数中"已经被尊重的字符串的地址.

解决此问题的一种方法是分配原始字符串的副本,将其传递给ReverseStr,然后您可以同时使用这两个版本:

int main()
{
  char str_unique[] = "abcdthelgko";
  char *str_dup = strdup(str_unique);
  int str_unique_len = sizeof(str_unique)/sizeof(str_unique[0]);

  printf("\n || %s || \n", str_unique);
  printf("Orig Str: | %s |, Rev Str | %s |\n", str_unique,
      ReverseStr(str_dup, str_unique_len - 1));

  free(str_dup); // Don't forget to free the memory allocated by strdup!
  return 0;
}
Run Code Online (Sandbox Code Playgroud)