c - 我刚刚开始学习C : Can someone explain what the pointers and typecasting are doing in this code?

标签 c pointers

//函数的开始:

char *encrypt(char *string, size_t length) {
}

我正在开始一个简单的加密函数,我想知道上面的代码到底在执行什么?我假设我正在将加密函数初始化为字符指针,内存目标为“字符串”,大小为“长度”

我说得对吗?

最佳答案

片段

char *encrypt(char *string, size_t length) {
}

定义一个名为encrypt的函数,它接受一个char *和一个size_t作为参数,并返回一个char *。正如所写,函数体是空的,并且将触发至少一个诊断,因为它没有返回值。

看起来它的意思是采用未加密的字符串作为string参数,并返回它的加密版本:

char unenc[] = "This is a test";
char *enc = encrypt( unenc, strlen( unenc ) );

我们处理指针是因为 C 处理数组表达式的方式。 字符串是包含 0 值终止符的字符值序列 - 字符串“hello”表示为序列 {'h', 'e', 'l', 'l ', 'o', 0}。字符串存储在字符类型的数组中(char 用于 ASCII、EBCDIC 和 UTF-8 编码,wchar_t 用于“宽”编码,如 UTF-16)。

但是,除非它是 sizeof 或一元 & 运算符的操作数,或者是用于初始化字符数组的字符串文字在声明中,数组类型的表达式被转换(“衰减”)为指针类型的表达式,表达式的值是数组第一个元素的地址。

我们将 unenc 定义为一个 char 数组,其大小足以容纳字符串 “This is a test”(14 个字符加上 0终结者)。当我们将 unenc 作为参数传递给 encrypt 时,它会从 char [15] 类型“衰减”为 char * >,函数实际接收的是数组第一个元素的地址(&unenc[0])。

数组表达式不能作为赋值的目标,并且函数不能返回数组类型。然而,加密是在内部工作的,它不能将加密的字符串作为数组返回;它只能返回指向存储字符串的数组的第一个元素的指针。

现在,在不知道实现的情况下,加密可能会就地加密字符串,覆盖数组的原始内容,并返回相同的地址:

char *encrypt( char *string, size_t length )
{
  for ( size_t i = 0; i < length; i++ )
    string[i] = replace_char( string[i] );
  return string;
}

由于 string 被声明为 char * 而不是 const char *,因此这是一个合理的推断。而且它可以避免内存管理的麻烦。当然,你会破坏你的输入,所以需要权衡。

如果没有就地加密,则 encrypt 函数需要分配新内存,或使用函数生命周期之外可用的内存(全局或已声明的局部内存static,这带来了自己的麻烦):

char *encrypt( char *string, size_t length )
{
  char *e = malloc( length + 1 );
  if ( e )
  {
    for ( size_t i = 0; i < length; i++ )
      e[i] = replace_char( string[i] );
  }
  return e;
}

关于c - 我刚刚开始学习C : Can someone explain what the pointers and typecasting are doing in this code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60210610/

相关文章:

c - 是否可以在线程中使用退出?

c - *ptr 和 **ptr 有什么区别?

c - 从具有函数名称后的数组维度的函数返回指向数组的指针

仅使用 Win32 的 Windows 应用程序是否可以通过 Windows 应用商店认证?

c - 为什么缺少头文件也能编译成功?

count_calls() 函数和返回值

c - 将 sqlite3_column_text() 返回到文字字符串

c - 如何更新必须经过 3 个函数的指针?

C++:比较运算符 > 和字符串文字的意外结果

c++ - "size_t"是否使代码可移植,或者只是 'more' 可移植?