C通过指针将数组传递给函数

C通过指针将数组传递给函数,c,arrays,pointers,C,Arrays,Pointers,我不熟悉C和指针,我想知道是否可以将数组指针传递给函数,而不是传递字符数组本身。我正在发布代码片段 char ipAddress[24]; int i, j; for (i = 12; i <= 13; i++) { for (j = 1; j <= 254; j++) { sprintf(ipAddress,"192.168.%d.%d",i,j); runCommand(ipAddress); } } // ... in

我不熟悉C和指针,我想知道是否可以将数组指针传递给函数,而不是传递字符数组本身。我正在发布代码片段

char ipAddress[24];
int i, j;
for (i = 12; i <= 13; i++)
{
    for (j = 1; j <= 254; j++)
    {
        sprintf(ipAddress,"192.168.%d.%d",i,j);
        runCommand(ipAddress);
    }
}

// ...

int runCommand (char x[24])
{
    // Do stuff.
}
字符地址[24];
int i,j;

for(i=12;i数组总是通过C中的指针传递,而不是通过值传递(复制)

所以

几乎相当于

int runCommand (char *x);

是的,可以将指向数组的指针传递给函数。不,这可能不是您想要的

int runCommand(char (*x)[24])
{
    if ((*x)[0] == '\0')  // Option 1
        return -1;
    if (x[0][0] == '\0')  // Option 2: equivalent to option 1.
        return -1;
    ...
}

void alternative(void)
{
    char y[24] = "Samizdat";
    printf("%d\n", runCommand(&y));
}
也就是说,
x
是一个指向24个字符数组的指针。不过要非常小心。一般来说,您不想传递指向数组的指针,只想传递指针

int runCommand(char x[24])  // Or: char *x
{
    if (x[0] == '\0')  // Option 1
        return -1;
    ...
}

void alternative(void)
{
    char y[24] = "Samizdat";
    printf("%d\n", runCommand(y));
}

这已经传递了一个指针。您需要指定您的问题。数组名称始终是指向数组第一个元素的指针-1:在函数
runCommand(char x[24])
中,
sizeof(x)
的值为
sizeof(void*)
而不是24。试试看。修复后给我一条注释。@JonathanLeffler是的!奇怪,但正确。无论编译器看到大小为真实类型,它都会继续模拟
char*
。因为我的背景基本上来自Perl,所以我更多的想法是将数组引用传递给函数并在以后对其进行解列在函数中,比传递数组本身更重要的是..i.ee通过引用传递而不是通过值传递。因此,如果我想从上面的代码中理解,数组总是通过C中的指针传递给函数,对吗?
int runCommand(char x[24])  // Or: char *x
{
    if (x[0] == '\0')  // Option 1
        return -1;
    ...
}

void alternative(void)
{
    char y[24] = "Samizdat";
    printf("%d\n", runCommand(y));
}