使用指向int的指针作为数组索引

Rob*_*eta 0 c arrays indexing pointers char

我有以下代码,这是一个更大的程序.我试图将一个int传递给一个函数,该函数将char数组的一部分(name [100])复制到另一个,直到达到某个字符,并更新int值.

#include <stdio.h>

void time_loop(int *a, char name[100], char *data, char until_char)
{
    int c = 0;    
    while(name[*a] != until_char)
    {
        data[c] = name[*a];
        a++;
        c++;
    }
    a = a +  2;
}

int main()
{
    int i = 3;
    char name[100] = {' ', ' ', ' ', 'f', 'o', 'o', ':', '\0'};
    char fill_this[15];

    time_loop(&i, name, fill_this, ':');
    printf("current char index: %d\n", i);
    printf("the word is: %s", fill_this);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

目前代码运行直到它达到:

while(name[*a] != until_char)
Run Code Online (Sandbox Code Playgroud)

一段代码,访问*a时遇到问题.

我总是可以采取简单的方法,并将功能更改为:

int time_loop(int a, char name[100], char *data, char until_char)
Run Code Online (Sandbox Code Playgroud)

并返回一个int,但必须有一种方法来正确地执行此操作.

问:将类型int*作为数组的索引号传递的正确方法是什么?

hne*_*atl 5

在某些情况下,您不会修改整数,而是修改指向它的指针.例如:

a++
a = a + 2
Run Code Online (Sandbox Code Playgroud)

两者都做指针运算 - 它们修改指针,而不是指向它的值.你想要的是:

(*a)++
*a += 2
Run Code Online (Sandbox Code Playgroud)

它们对值本身执行修改,而不是指针.


请注意,由于您没有进行边界检查,因此可以在数组的末尾运行(如果您要搜索的字符不在数组中),这是未定义的行为.您还应该确保null终止输出字符串 - \0在最后一个字符后添加一个.如果您尝试打印字符串,则不执行此操作可能会导致以后出现未定义的行为.