C 将字符串数组的值传递给另一个函数

C 将字符串数组的值传递给另一个函数,c,C,我目前在编程的第一年,已经用字符串数组解决了一些代码的问题,但不知道为什么它会起作用。我们仍在研究指针,但我想尝试一下数组 我想从主函数传递字符串的值,传递到另一个函数,并将其与另一个字符串进行比较。如果两个字符串相等,则打印“相等”,否则打印“不相等”。虽然我已经解决了这个问题,但我对它的工作原理感到困惑: char name1[100]; scanf("%s",name1); getname(name1[0]); return 0; } voi

我目前在编程的第一年,已经用字符串数组解决了一些代码的问题,但不知道为什么它会起作用。我们仍在研究指针,但我想尝试一下数组

我想从主函数传递字符串的值,传递到另一个函数,并将其与另一个字符串进行比较。如果两个字符串相等,则打印“相等”,否则打印“不相等”。虽然我已经解决了这个问题,但我对它的工作原理感到困惑:

       char name1[100];
       scanf("%s",name1);
       getname(name1[0]); 

return 0;
}

void getname(char name1[0]){

    printf("Name1 is %s",name1);

    return;
}
如果以这种方式运行,它将不会运行该函数,并将返回一个垃圾值。但是,如果我改变

getname(name1[0]);
进入

它工作得很好,这是为什么?。其次,在“getname”函数中。因为我必须将符号和/地址添加到函数调用中,所以我被教导需要在变量旁边添加星号,以避免获取实际地址,而是获取实际值。为什么它在里面

printf("Name1 is %s",name1);
它能够完美地打印字符串,而无需:

printf("Name1 is %s",*name1);
void-getname(char-name1[0])
正式表示要传递一个大小为零的字符数组(旁注:但编译器有时允许这样做)

它真正的意思是你要传递一个字符指针,一个
char*
。大小将被忽略。它相当于不那么令人困惑的:
void getname(char*name1)

此外,由于您不打算更改函数中的字符串,因此可以声明它
const char*
,并在尝试更改时发出警告

#include <stdio.h>

void getname(const char *name1){
    printf("Name1 is %s",name1);

    return;
}

int main() {
    char name[100] = "foo";
    getname(name);
}
您应该得到如下警告:

incompatible integer to pointer conversion passing 'char' to parameter of
      type 'const char *'; take the address with & [-Wint-conversion]

这就引出了一件非常重要的事情:编译器警告。它们非常重要,默认情况下处于禁用状态。打开它们可以帮你省去几个小时的挠头。有一系列令人困惑的可能警告,而且每个编译器的警告略有不同。下面是我使用的
clang

-Wall -Wshadow -Wwrite-strings -Wextra -Wconversion -std=c11 -pedantic
你可以在书中读到每一个词的意思。是的,“-Wall”并不意味着“所有警告”

我建议,一个好的代码编辑器在编辑时也会给你警告


getname(&name1[0])
之所以有效,是因为它相当于
getname(name1+0)
,后者相当于
getname(name1)
name1[0]
是字符串的第一个字符
&
获取它的地址,它是字符串的开头,就像
name1
本身一样
printf
然后打印字符,直到到达空字节


您可以通过尝试
getname(&name1[1])
或更直接地使用指针算法
getname(name1+1)
来看到这一点。这将传入name1中第二个字符的地址。如果
name1=“Yarrow Hock”
它将打印
箭头Hock
。这是一种在不改变字符串的情况下跳过前缀的有效技术。

为了确保我理解,
name1
被声明为
char name1[100]
?你是如何分配的?我想你的问题中已经有了所需的信息,但理想情况下,请将你显示的代码部分转换为。可能的副本
incompatible integer to pointer conversion passing 'char' to parameter of
      type 'const char *'; take the address with & [-Wint-conversion]
-Wall -Wshadow -Wwrite-strings -Wextra -Wconversion -std=c11 -pedantic