我写了一个小测试程序,看看如何将指向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数组。
答案 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]);