我错过了传递价值观的基本观点。
在我的代码中,我编写了这个原型/函数:
void drawFont (char A[],unsigned char length, char x1, char y1, uint16 FGcolor);
我使用这样的调用来调用函数:
drawFont ("William",7,15,25,YEL,0);
或
drawFont ("W",1,15,25,YEL,0);
这两个在代码中都可以正常工作。如果我检查函数中的A [0],我会看到' 57'表示ASCII' W'。一切都很好。
我的问题是:当我试图复制“W'使用ASCII值而不是字符串表示,我的代码失败示例:
drawFont (57,1,15,25,YEL,0);
代码中A [0]的值为:0,但A的地址为57.所以编译器假定我想传递一个指针?我很困惑,为什么它传递的字符串很好,但不是值?
先谢谢新手C程序员。
答案 0 :(得分:2)
如果你通过
drawFont (57,1,15,25,YEL,0);
你将和
一样崭露头角drawFont ('W',1,15,25,YEL,0);
这只是一个字符。该功能需要一系列字符,这就是为什么它不正确。
答案 1 :(得分:1)
A[]
的值实际上是一个指针,例如&A[0]
(您可以使用char *A
而不是char A[]
<重写该函数/ p>
这是第一个插槽的地址,而不是存储在其中的插槽。在指针指向的内存位置中,存在值57
。当您使用char数组或char指针参数编写函数时,您告诉编译器:我将为您传递一个内存地址。转到该地址并开始读取每个字符(数字),直到到达空字节,然后停止。
但是当你传递文字整数57作为参数时,这不是一个指向字符数组的有效指针。你错过了间接的程度。
因此,假设您的char [[]位于0xfeaa0011
在0xfeaa0011
的RAM中 - &gt; &#34;威廉&#34; (或52,......)
对drawFont()的正确调用实际上看起来像drawFont(0xfeaa0011
,1,15,25,YEL,0)
所以你看到用57取代指针并不是同样的事情。
答案 2 :(得分:1)
函数的原型声明第一个参数是指向字符的指针:
void drawFont (char A[],...);
如果传递整数,则违反了规则。编译器应该警告它。我在func(57)
:
void func(char a[])
{
}
char arr[] = {87,84,70};
int main()
{
func(57);
func("W");
func(arr);
}
x.c(9) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'int'
x.c(9) : warning C4024: 'func' : different types for formal and actual parameter 1
如果你看一下编译器的汇编输出,你可以更清楚地看到问题(我剪掉了不感兴趣的部分):
PUBLIC _arr
_DATA SEGMENT
_arr DB 057H ;Here's the char array at an address in memory.
DB 054H
DB 046H
ORG $+1
$SG1297 DB 'W', 00H ;Here's the "W" at an address in memory (nul-terminated)
_DATA ENDS
; 9 : func(57);
00003 6a 39 push 57 ; Push 57 as the address, WRONG!
00005 e8 00 00 00 00 call _func
0000a 83 c4 04 add esp, 4
; 10 : func("W");
0000d 68 00 00 00 00 push OFFSET $SG1297 ; Push the address of the string.
00012 e8 00 00 00 00 call _func
00017 83 c4 04 add esp, 4
; 11 : func(arr);
0001a 68 00 00 00 00 push OFFSET _arr ; Push the address of the array.
0001f e8 00 00 00 00 call _func
00024 83 c4 04 add esp, 4
代码期望转到地址来读取字符。谁知道57号地址是什么。
答案 3 :(得分:0)
您的函数需要一个字符串(char [])作为参数。 当你通过&#34;威廉&#34;它被解释为一个字符串,这是正常的。 当你通过&#34; W&#34;它也被解释为一个字符串:
string[2] = { 'W' + 0 } //notice the null byte following your char
那是因为你使用了双引号&#34;而不是单引号&#39;。 因此通过57或者&#39; W&#39;被视为单个字符而不是char [] /字符串,因为您的函数期望char []并且您给它一个字符,然后它会给您一个错误。