C指针阵列;致原始

时间:2017-09-23 14:22:01

标签: c pointers address-operator

我正在使用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。

  

点 - 具有语法特异性并纠正所有警告

1 个答案:

答案 0 :(得分:3)

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

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

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

不正确的。 &name是指向整个数组的指针,而不仅仅是它的第一个元素。分配是类型错误:pnamechar *,但&pnamechar (*)[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

不正确的。这是类型错误:ageintpageint *

你从哪个来源学习C?

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