将指针传递给c中的char数组

时间:2013-03-04 22:51:35

标签: c

我写了一个小测试程序,看看如何将指向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是一个传递原始[0]的内存地址的指针,当我执行这个程序时,我发现了一些令我困惑的事情,并让我怀疑我的事实了解指针。

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

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

我在这个问题中的基本疑问是org正在做什么,我理解它是一个指向内存地址的char指针(哪个??)。任何帮助,将不胜感激 。我是c编程的新手。

当我尝试像

这样的while循环时
while(out[i] !='\0')
printf("%s",out[i]);

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

2 个答案:

答案 0 :(得分:3)

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

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

请记住,数组的名称等同于&array[0],即当您在函数中传递数组的名称时,您将传递指向第一个元素的指针。所以在这里,当你致电scopy(original)时,它与写scopy(&original[0])相同,而且original[0]char&是指向它的指针,这就是为什么你的函数需要char *

答案 1 :(得分:0)

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

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

完全相同

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

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

您可以通过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]);