我才刚刚开始学习C:有人可以解释一下此代码中的指针和类型转换吗?

时间:2020-02-13 14:53:53

标签: c pointers

//函数开始:

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

我正在开始一个简单的加密功能,我想知道上面的代码究竟在执行什么操作?我假设我正在将加密函数初始化为char指针,其存储目标为“字符串”,大小为“长度”

我正确吗?

2 个答案:

答案 0 :(得分:0)

定义(实现)一个名为encrypt的函数。如果尚未声明,它也可能声明

此函数有两个参数:

  • 一个名为string且类型为char *(指向char的指针)
  • 一个名为length的类型size_t

该函数返回一个char *(指向char的指针)。

可以使用任何类型的变量来调用该函数,这些变量是(或可以转换为)指向charsize_t的指针。例如,以下内容有效:

char some_string[] = "foobar";

encrypt(some_string, strlen(some_string));

答案 1 :(得分:0)

摘要

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处理数组表达式的原因,我们正在处理指针。 string 是包含0值终止符的字符值序列-字符串“ hello”表示为序列{'h', 'e', 'l', 'l', 'o', 0}。字符串存储在字符类型的数组中(对于ASCII,EBCDIC和UTF-8编码,为char;对于诸如“ UTF-16”的“宽”编码,为wchar_t)。

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

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

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

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

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函数需要分配新的内存,或者使用在函数生命周期之外可用的内存(已声明为{{1}的全局或局部) },这会带来自己的头痛):

static
相关问题