使用C

时间:2017-06-14 18:17:55

标签: c arrays

例如,如果我有一个数组,并且我想要将具有指定值的此数组的元素作为新数组提取。我做了如下:

int a[10] = { 1, 2, 1, 3, 2, 3, 4, 1, 2, 6 };
int i, k;

int count = 0;
for (i = 0; i < 10; i++) {
    if (a[i] == 1) {
        count = count + 1;
    }
}

int b[count];
k = 0;
for (i = 0; i < 10; i++) {
    if (a[i] == 1) {
        b[k] = a[i];
        k = k + 1;
    }
}

因此,对于数组“a”,我提取了值1的所有元素,并将它们作为新数组“b”。如何通过使用指针实现相同的功能?它会比这更简洁吗?如果有可能,还有其他优势吗?

3 个答案:

答案 0 :(得分:3)

我想你已经注意到你只需要多次写1;但我想你想要它适用于任意条件。

“使用指针”可以表示动态内存分配而不是可变长度数组。只是为了使用指针,你可以写:

int *b = malloc(count * sizeof(int));
k = 0;
for (i = 0; i < 10; i++) {
    if (a[i] == 1) {
        b[k] = a[i];
        k = k + 1;
    }
}

如果,为了使用指针进行编写过程,您可以按如下方式调整程序:

int *b = malloc(count * sizeof(int));
int *bPtr = b;
for (i = 0; i < 10; i++) {
    if (a[i] == 1) {
        *bPtr++ = a[i];
    }
}

希望它有所帮助。

答案 1 :(得分:3)

如果你不知道你的目标值将在数组的哪个部分,就像在你的情况下,你在整个未排序的数组中搜索特定值,那么使用指针而不是线性搜索,找到你所追求的数组中的元素。

但是,如果,您试图从数组中的已知索引开始访问或复制一组连续的元素,那么您可以使用指针来简化操作。例如,如果我在char数组中的最后几个元素之后,这可以工作:

#include <stdio.h>
int main()
{
    char str[100] = "I don\'t want anyone to think I hate the Calgary Flames";
    char *c = (str + 29);
    printf("%s\n", c);
    return 0;
}

输出:

I hate the Calgary Flames

答案 2 :(得分:2)

在这种情况下,不,没有任何好处。 a[i]已基本为a + (sizeof(int) * i)。即使你使用了指针,你仍然必须做所有的计数,以确保你不会走出数组的末尾。

它常用的方法是使用一个空终止的指针数组,例如一个字符串,你不知道它的长度。但这并不是关于性能的。如下所示,他们必须做大致相同的事情。

char string[] = "foo bar";

// Allocate and initialize i.
// `string + i` twice, compare, increment.
for( int i = 0; string[i] != '\0'; i++ ) {
    printf("%c", string[i]);
}
puts("");

// Allocate and initialize s.
// Dereference s twice, compare, increment.
for( char *s = string; *s != '\0'; s++ ) {
    printf("%c", *s);
}
puts("");

当你需要通过几个步骤迭代数组时,通过指针迭代是很方便的。而不是传递原始数组指针加上最后一个索引,并更改所有函数签名以适应,只需传递递增的指针并返回递增的指针。这允许您在字符串的中间使用标准字符串函数。

#include <stdio.h>

char *findVal( char *string, char delim ) {
    char *val = string;
    for( ; *val != '\0' && *val != delim; val++ ) {
    }

    if( val == '\0' ) {
        return NULL;
    }
    else {
        // val is sitting on the ':'
        return val+1;
    }
}

int main() {
    char string[] = "this:that";

    char *val = findVal(string, ':');
    if( val != NULL ) {
        // Just use val, not string[valIdx].
        printf("%s\n", val);
    }
}

这也更安全。对于偏移,有两件事必须保持同步,指针和偏移;这可能会导致错误的偏移量与错误的指针一起使用。递增的指针带有它的偏移量。

正如评论中指出的那样,你可以像这样收紧第二个循环:

int b[count];
for (i = 0; i < count; i++) {
    b[i] = 1;
}