[英]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.