将值传递给函数

时间:2014-10-28 06:22:00

标签: c arrays parameters parameter-passing

我错过了传递价值观的基本观点。

在我的代码中,我编写了这个原型/函数:

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程序员。

4 个答案:

答案 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 []并且您给它一个字符,然后它会给您一个错误。