繁体   English   中英

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

[英]C derenferencing pointer to character array

我试图通过在教程中找到的这个小例子来掌握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函数希望它是一个字符串 (指向以零结尾的字符数组的指针),而不是单个字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM