我试图通过我在教程中找到的这个小例子来掌握 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/