2011-07-10 124 views
5

我是C新手。指向数组中第一个元素的指针! (C)

我知道这已被问过很多形式,但我的是有点独特的...我猜。我有一个无符号的短指针。

6 unsigned short *pt; 
7 pt = myArray[0]; 

阵列被声明为这样:const unsigned short myArray[1024]和的形式为0×0000等的十六进制数的数组。

我尝试编译,它抛出这些错误:

myLib.c:7: error: data definition has no type or storage class 
myLib.c:7: error: type defaults to 'int' in declaration of 'pt' 
myLib.c:7: error: conflicting types for 'pt' 
myLib.c:6: note: previous declaration of 'pt' was here 
myLib.c:7: error: initialization makes integer from pointer without a cast 

什么错的任何想法?

感谢, 菲尔

+2

请注意,诸如十六进制,十进制和八进制等表示法仅适用于源代码中的整数文字。在编译的程序中没有十六进制数字(或十进制数字或你有什么)。整数使用平台提供的任何格式(通常是2的补码)。因此,'myArray'只是一个const unsigned shorts数组,而不是“十六进制数”。 – outis

+0

@outis:关于重要编程概念的出色观察。我已将它添加到我的软件概念清单中。 –

回答

5

&是参考运算符。它返回它前面的变量的内存地址。指针商店内存地址。如果你想“用指针存储东西”,你可以使用*运算符对它进行解引用。当你这样做时,计算机将查看你的指针所包含的内存地址,这适用于存储你的值。

char *pc; // pointer to a type char, in this context * means pointer declaration 
char letter = 'a'; // a variable and its value 

pc = &letter; // get address of letter 
// you MUST be sure your pointer "pc" is valid 

*pc = 'B'; // change the value at address contained in "pc" 

printf("%c\n", letter); // surprise, "letter" is no longer 'a' but 'B' 

当您使用myArray[0]你没有得到一个地址,但值,这就是为什么人们使用&myArray[0]

7

我猜(只显示两行)是出现在函数外部的代码。这是一个声明:

pt = myArray[0]; 

声明必须进入函数。另外,如果myArray有类型unsigned short[],那么你想要做的这些,而不是一个:

pt = myArray; 
pt = &myArray[0]; // same thing 
+0

啊...哇是的,它是一个功能之外!谢谢!我将它移到了正确的位置,大部分错误都消失了。所以现在我有: 22 unsigned short * pt; 23 pt =&myArray [0]; 在我的函数的main()中。是的由于某种原因,我仍然得到 Program.c:23:错误:分配丢弃指针目标类型的限定符 对此有何想法?我是否需要展示更多线条? – Phil

+3

如果你的数组的类型为'const unsigned short [1024]',那么你的指针应该有'const unsigned short *'类型。被抛弃的限定符是'const'。尝试使用'clang'编译器而不是'gcc',错误信息更具信息性。 –

3

呀,你真的应该包括更多的代码,所以我们可以看到上下文。

我不太清楚错误信息,但是你的代码不正确。

尝试:

pt = &myArray[0]; 

或者:

pt = myArray + 0; 

或者只是:

pt = myArray; 

相反。

+0

我有点好奇“pt = myArray + 0;'的动机是什么? –

+3

@GavinH:动机是教学法。 – John

+0

@John:当然,它演示了指针运算,但有很强的理由使用选项1或选项3,但我不认为选项2存在这种原因。添加'pt =&0 [myArray];'也可以,但wouldn没有提供任何真正的使用动机。 –

0

你不应该丢掉const修饰符;所以指针应该有一个const修饰符。

const unsigned short myArray[1024]; 
const unsigned short * pointer = myArray; // set pointer to first element 
+1

我认为(但我可能会误解)你的答案适用于C++,但不适用于C(OP正在使用)。 –

+0

不,我只是用MinGW的C++编译器(g ++)来测试它。它编译时没有任何警告,指针可以读取数组,并且(当我删除const修饰符时)写入数组。 –

+1

这是我的观点。 OP正在使用C. –

相关问题