当前位置: 首页 > 知识库问答 >
问题:

带有字符 *、无符号字符 * 和已签名字符 * 的别名

殳睿
2023-03-14

char*(和限定变体)可以别名任何内容。有符号char*无符号char*(及其限定变体)是否不受此限制?

换句话说,我已经了解到,如果我不希望char*函数参数别名其他类型的指针参数(因为它们可以别名它们),那么将 restrict 应用于 char* 函数参数是一个好主意:

int func(struct foo *f, char * restrict s /*different object*/);

我可以像这样删除有符号和无符号char变体的限制关键字吗?

int sfunc(struct foo *f, signed char *s /*different object*/);
int ufunc(struct foo *f, unsigned char *s /*different object*/);

同样,指向同一类型的有符号和无符号变体的指针是否可以相互别名?换句话说,如果我期望一个指向int的指针和一个指向unsigned的指针,并且它们应该指向不同的对象,那么int*unsigned*参数是否都应该是 -限定的?

/* i and u should be different */
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u); 

共有1个答案

越星晖
2023-03-14

规则是(C11 6.5/7):

对象的存储值只能由具有以下类型之一的左值表达式访问:

    < li >与对象的有效类型兼容的类型, < li >与对象的有效类型兼容的类型的限定版本, < li >与对象的有效类型对应的有符号或无符号类型, < li >一种类型,它是与对象的有效类型的合格版本相对应的有符号或无符号类型, < li >成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的成员),或者 < li >一种字符类型。

字符有符号字符无符号字符都是字符类型(参考:6.2.5/15)。前面的项目符号还回答了您关于有符号和无符号类型的问题。

请记住,固定宽度类型是typedef,它可能引用各种其他类型,所以要小心。

 类似资料:
  • 在我的应用程序中,我可以选择签署pdf文件。pdf签名有两个选项,一个是创建新签名,另一个是我需要签署空签名字段。我做了创建新签名字段的部分,它工作正常,现在我在签名空签名字段时遇到了问题。这是我的密码 这段代码添加了一个新的签名,我需要做什么更改来签名空签名字段名“GoodSignature”

  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 问题内容: 在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我所拥有的只是int值240(二进制(24位+ 11110000)= 32bits),如何获得该int的带符号值? 问题答案: 除了,Java没有其他无符号值。考虑以下代码段: 结果将为-1,因为最低的8位已复制到byte变量中。

  • 说我想打印: 这是正确的。这: 或者这个: ? 事情是在其他地方,所以我遇到了这样的讨论: -即使ch变为无符号字符,代码的行为也不是由C标准定义的。这是因为无符号字符被提升为int(在普通的C实现中),所以int被传递给printf的说明符%u。但是,%u需要一个无符号int,所以类型不匹配,并且C标准没有定义该行为 -你的评论不正确。C11标准规定转换说明符必须与函数参数本身的类型相同,而不是

  • 问题内容: 我正在使用一个返回字节字符串的库,我需要将其转换为字符串。 尽管我不确定有什么区别-如果有的话。 问题答案: 假设使用Python 3(在Python 2中,这种区别的定义不太明确)-字符串是字符序列,即unicode码点;这些是一个抽象概念,不能直接存储在磁盘上。毫无疑问,字节字符串是字节的序列- 可以 存储在磁盘上的东西。它们之间的映射是一种 编码 -其中有很多(并且无限可能)-并

  • 我正在与Scribbler2机器人和Fluke2板工作,并通过Java中的Myro与Fluke沟通。Fluke board是Scribbler和用Java编写的桌面客户端之间的蓝牙通信桥梁。它通过一个RS232串口与涂写器通信。 这可能是一个愚蠢的问题,上面的系统很复杂,所以如果我不能很好地解释这一点,请原谅我。 我的问题的背景:Java使用有符号字节。Fluke是(我想)用C写的,所以使用了无符