C取消引用指向字符数组的指针

标签 c arrays pointers

我试图通过我在教程中找到的这个小例子来掌握 C 指针:

#include <stdio.h>

int main() {
    char vowels[] = {'A', 'E', 'I', 'O', 'U'};
    char *pvowels = &vowels;

    printf(pvowels);
//  printf(*pvowels);
    return 0;
}

如果我编译它,我会收到警告“从不兼容的指针类型初始化”,但它仍会编译/运行,打印 AEIOU 和一些随机垃圾字符。我还假设 *pvowels 将是元音数组第一个内存位置的字符,因此打印一个“A”,但它只是段错误。

我的两个问题是:

为什么第一个 printf 打印出元音 + 垃圾?

为什么第二次打印不打印出 A?

最佳答案

当您使用&vowels 时,您会得到一个指向数组 的指针,而不是数组中的第一个元素。 &vowels 的类型是char(*)[5]

要解决此问题,您应该使用 &vowels[0] 获取指向第一个元素的指针,或者依靠数组自然衰减到指向其第一个元素的指针:

char *pvowels = vowels;

第二个问题是您将 pvowels 视为字符串,但字符串是带有终止​​符 的字符序列。由于数组 vowels 没有此终止符,因此 printf 调用将越界,您将有未定义的行为

至于最后一个问题,当你取消引用一个指针时,你会得到它指向的位置的值。因为数组的位置从数组的第一个元素开始 &vowels[0]&vowels 指向相同的位置,所以当你取消引用 pvowels 您将获得数组的第一个元素,即字符 'A'但是您不能将它用作printf 的第一个参数,因为printf 函数期望它是一个string(指向以零结尾的字符数组的指针),而不是单个字符。

关于C取消引用指向字符数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42750437/

相关文章:

c++ - 手动生成 mipmap

c - 参数 2 的类型为 int * 并且想要读取文件

c - 从函数引用数组

c - 如何在输出中获得 0?

c - 静态常量结构成员

c# - 使用数组对最近的数字进行排序

c++ - *bool 数组是否被正确删除 C++

java - 始终在范围内取不同的随机元素

c - 尝试使用指针在数组中插入元素,但未成功

c++ - 暂住地址