c - 如何满足有关 printf() 上不兼容类型的警告
问题描述
我正在学习 learn-c.org 上的教程。来到关于Arrays 和 Pointers的部分,如果我在我的系统上运行示例程序的前两行,它们会发出警告:
char vowels[] = {'A', 'E', 'I', 'O', 'U'};
char *pvowels = &vowels;
代码运行,但我收到以下警告:
警告:从不兼容的指针类型“char (*)[5]”初始化“char *”[-Wincompatible-pointer-types] 15 | 字符 *pvowels = &元音;
如果我将它转换为,我可以摆脱这个警告
char *pvowels = (char *) &vowels;
但这是否是处理该警告的正确方法,只是投掷它?首先这似乎没有必要,我真的不明白char *
and之间的区别char (*)
。
接下来,该printf
行对第三个参数发出警告,说:
警告:格式“%u”需要“unsigned int”类型的参数,但参数 3 的类型为“char *”[-Wformat=]
(论点 5 和 7 相同)
这个我什至不知道如何投射以绕过警告......打印这个的正确方法是什么?
他们教程中的整个程序供参考:
char vowels[] = {'A', 'E', 'I', 'O', 'U'};
char *pvowels = &vowels;
int i;
// Print the addresses
for (i = 0; i < 5; i++) {
printf("&vowels[%d]: %u, pvowels + %d: %u, vowels + %d: %u\n", i, &vowels[i], i, pvowels + i, i, vowels + i);
}
// Print the values
for (i = 0; i < 5; i++) {
printf("vowels[%d]: %c, *(pvowels + %d): %c, *(vowels + %d): %c\n", i, vowels[i], i, *(pvowels + i), i, *(vowels + i));
}
解决方案
随着&vowels
您获得指向数组本身的指针,该指针的类型char (*)[5]
如错误消息中所述。你似乎想要的是一个指向数组中第一个元素&vowels[0]
的指针,或者是简单vowels
的,因为它衰减到指向其第一个元素的指针:
char *pvowels = vowels;
此外,当您想打印指针时,printf
您需要使用%p
格式。它打印类型的“通用”指针void *
,因此要完全正确,您需要将所有指针转换为void *
printf("&vowels[%d]: %p, pvowels + %d: %p, vowels + %d: %p\n", i, (void *) &vowels[i], i, (void *) (pvowels + i), i, (void *) (vowels + i));
推荐阅读
- python - 属性中的嵌套数据不可访问
- flutter - Flutter:提供者:ListView 在 notifyListener() 之后没有重新绘制
- amazon-web-services - 使用 hive Metastore 为自定义 s3 设置 presto
- java - 将 libgdx 项目从 java 转换为 kotlin 后无法找到或加载主类
- python - 有没有办法在特定位置“叠加”两个(熊猫)数据帧?
- android - Android Studio 混合了两个不同应用程序的代码
- python - "int 'object is not subscriptable"
- docker - 为什么我不能从 GAE 中的内部或外部 IP 访问我的容器?
- python - 这个修改后的清理功能是否正确?
- reactjs - AppSync 列表查询从 JS 客户端应用程序返回空数组,但从 AppSync 控制台返回填充数组