【问题标题】:C Pointer To Array; To PrimitiveC 指向数组的指针;原始
【发布时间】:2017-09-23 14:22:01
【问题描述】:

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

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。

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

【问题讨论】:

  • The following will also work page = age; 不,不会
  • 请编译您的代码并查看警告/错误。您将得到答案
  • 认真对待编译器的警告。 C 是一门成熟的语言,它希望它的用户行为相同。
  • 也许问题是我使用 Visual Studio 而不是 TDM GCC 和 Eclipse。如何启用编译器警告?另外,如果它们只是警告而不是错误,我的目标是确保在执行程序之前纠正所有警告吗?
  • 确保在执行程序之前纠正所有警告?”是的,完全正确。提示:不要盲目地“抛弃”警告。

标签: c pointers address-operator


【解决方案1】:
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

不正确。这是一个类型错误:ageint,但 pageint *

您从什么来源学习 C?

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

【讨论】:

  • 嗯,这实际上不是一个答案,但好吧......无论如何都是1+。 ;-)
  • @alk 好吧,这个问题不能按要求回答,因为它基于错误的假设(“缩短版本”是非常不同的代码)。我试图回答“我该怎么做”。
  • 你能提供一个更好的答案吗?正如你能证明一个指向不使用地址运算符的类型的指针是如何声明指针变量的正确方法吗?我会修改我的问题。
  • @Mushy 我不明白你在问什么。
  • 我倾向于用“[too long for a comment]”之类的前缀来注释这类“答案”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2010-10-11
  • 2021-11-15
  • 2013-04-19
相关资源
最近更新 更多