1

我编写了一个小型测试程序,看看如何将指向 char 数组的指针传递给函数。这是我的代码:

#include <stdio.h>
#include <string.h>

int scopy(char *org ){
    printf("the value of org is %s" , org);
    printf("\n");
}

int main(void)
{
    char original[11];
    strcpy(original , "helloworld");

    scopy(original);

    printf("the value of original now is %s" , original);

    return 0;
}

我对指针的了解告诉我 org 是一个指针,它传递了 original[0] 的内存地址,当我执行这个程序时,我观察到一些让我感到困惑并让我怀疑我所了解的关于指针的事实的事情.

当我打印 org 时,我得到了完整的单词。但是根据逻辑,如果指针不应该打印出内存地址;

当我尝试打印 out[1] , out[2] 时,键盘告诉我进程异常结束

我对这个问题的基本疑问是 org 到底在做什么,我知道它是一个指向内存地址的 char 指针(哪个??)。任何帮助,将不胜感激 。我对 c 编程很陌生。

另外,当我尝试像这样的while循环时

while(out[i] !='\0')
printf("%s",out[i]);

它不会在 '\0' 处终止。strcpy 文档指出 '\0' 被复制到 char 数组中。

4

2 回答 2

3

org 是指向 char 的指针,这是您在 scopy 中传递的内容(指向数组第一个元素的指针)。当您%s在 printf 中使用说明符时,您将指向 char 的指针视为字符串;如果要将其值打印为指针,则应%p改为使用。例如:printf("The memory address in org is %p\n", org);

从你所说的我得到你认为%s将数字转换为字符串的感觉。它不会那样做,它需要一个指向字符串第一个字符的指针。

请记住,数组的名称等价于&array[0],即当您在函数中传递数组的名称时,您传递的是指向第一个元素的指针。因此,在这里,当您调用scopy(original)它时,它与 write 相同scopy(&original[0]),并且由于original[0]是 achar并且&是指向它的指针,这就是您的函数需要char *.

于 2013-03-04T22:59:15.383 回答
0

是的,你是对的,当你调用scopy 时scopy(original);,scopy 会传递一个指向original数组中 1. 元素的指针。

scopy(original);scopy(&original[0]);

但是,您将 %s 与 printf 一起使用。%s 期望匹配的参数是一个字符指针,指向一个字符序列,并且该序列的结尾是一个 0 字节。这就是 C 所说的字符串。

这意味着你不能做 eg printf("%s",org[i]);,因为 org[i] 是一个字符,它不是指向以 0 字节结尾的数组的字符指针。

prinf["%c", org[0])您可以通过执行`while(out[i] !='\0')打印单个字符

或者对于您的 while 循环:

while(out[i] !='\0')
  printf("%c",out[i]);

你也可以尝试:

while(out[i] !='\0')
  printf("%s",&out[i]);
于 2013-03-04T23:00:14.903 回答