我正在使用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。
点 - 具有语法特异性并纠正所有警告
答案 0 :(得分:3)
char* pname = name; // points to first char in array
正确。在评估数组时,会得到指向其第一个元素的指针。
pname = &name; // points to first char in array
不正确的。 &name
是指向整个数组的指针,而不仅仅是它的第一个元素。分配是类型错误:pname
是char *
,但&pname
是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
不正确的。这是类型错误:age
是int
,page
是int *
。
你从哪个来源学习C?
不幸的是,我无法告诉您如何配置Visual Studio 2015,因为我之前从未使用过它。你试过阅读它的手册吗?