0

我使用的 Visual Studio 2015 没有显示与我使用指针相关的编译器警告。如果我暂时提到一个指向char* p数组的指针char name[] = "My Name",我没有任何指导说明以下内容并不完全相同;即导致指向数组第一个字符的指针

char* pname = name; // points to first char in array

printf("\n%c\n", *pname);

pname = &name; // points to first char in array

printf("\n%c\n", *pname);

pname = &name[0]; // this explicitly points to the first char in the array

printf("\n%c\n", *pname);

每个的结果printf都是相同的值,因为我没有看到编译器警告,我需要指导哪种形式是正确的。

这与指向 int 的指针相同,因此我没有看到编译器警告,因此我假设以下内容是等效的

int age = 45;
int* page = &age; // point to age
page = age // pointer to age

有人可以澄清这一点,或者帮助我在 Visual Studio 2015 中打开编译器警告,而无需切换到 TDM GCC + Eclipse Oxygen。

要点 - 语法具体并更正所有警告

4

1 回答 1

3
char* pname = name; // points to first char in array

正确的。当你评估一个数组时,你会得到一个指向它的第一个元素的指针。

pname = &name; // points to first char in array

不正确。&name是指向整个数组的指针,而不仅仅是它的第一个元素。赋值是一个类型错误:pname是 a char *,但是&pname是 a char (*)[8]

pname = &name[0]; // this explicitly points to the first char in the array

正确的。这个工作的原因是因为a[b]被定义为*(a + b)。所以&name[0]真的是意思&*(name + 0)。和以前一样,数组计算为其第一个元素的地址。添加0不会改变它。*取消引用指针,但&返回地址(它们相互抵消)。

int age = 45;
int* page = &age; // point to age

正确的。

page = age; // pointer to age

不正确。这是一个类型错误:ageis an intbut pageis an int *

你是从什么来源学习 C 的?

不幸的是,我无法告诉您如何配置 Visual Studio 2015,因为我以前从未使用过它。你试过阅读它的手册吗?

于 2017-09-23T14:38:00.507 回答